2014-12-10 2 views
6

В индексе, который я создаю, я заинтересован в выполнении запроса, а затем (используя грани), возвращающего черепицу этого запроса. Вот анализатор я использую по тексту:Использование черепицы и стоп-слов с помощью Elasticsearch и Lucene 4.4

{ 
    "settings": { 
    "analysis": { 
     "analyzer": { 
     "shingleAnalyzer": { 
      "tokenizer": "standard", 
      "filter": [ 
      "standard", 
      "lowercase", 
      "custom_stop", 
      "custom_shingle", 
      "custom_stemmer" 
      ] 
     } 
     }, 
     "filter": { 
     "custom_stemmer" : { 
      "type": "stemmer", 
      "name": "english" 
     }, 
     "custom_stop": { 
      "type": "stop", 
      "stopwords": "_english_" 
     }, 
     "custom_shingle": { 
      "type": "shingle", 
      "min_shingle_size": "2", 
      "max_shingle_size": "3" 
     } 
     } 
    } 
    } 
} 

Основной проблемой является то, что, с Lucene 4.4, остановить фильтры больше не поддерживают параметр enable_position_increments для устранения гальки, которые содержат стоп-слова. Вместо этого, я хотел бы получить результаты, как ..

«красные и желтые»

"terms": [ 
    { 
     "term": "red", 
     "count": 43 
    }, 
    { 
     "term": "red _", 
     "count": 43 
    }, 
    { 
     "term": "red _ yellow", 
     "count": 43 
    }, 
    { 
     "term": "_ yellow", 
     "count": 42 
    }, 
    { 
     "term": "yellow", 
     "count": 42 
    } 
] 

Естественно, это ЗНАЧИТЕЛЬНО перекосов количества гальки вернувшейся. Есть ли способ post-Lucene 4.4 для управления этим без последующей обработки результатов?

+1

Вы нашли решение этой проблемы? – paweloque

+0

дублированный вопрос: http://stackoverflow.com/questions/22609100/elasticsearch-shingles-with-stop-words-elimination – paweloque

ответ

6

Возможно, это не самое оптимальное решение, но самым тупым было бы добавить еще один фильтр в ваш анализатор, чтобы убить токены наполнителя «_». В приведенном ниже примере я назвал его «kill_fillers»:

"shingleAnalyzer": { 
     "tokenizer": "standard", 
     "filter": [ 
     "standard", 
     "lowercase", 
     "custom_stop", 
     "custom_shingle", 
     "custom_stemmer", 
     "kill_fillers" 
     ], 
     ... 

Добавить «kill_fillers» фильтр в список фильтров:

"filters":{ 
... 
    "kill_fillers": { 
    "type": "pattern_replace", 
    "pattern": ".*_.*", 
    "replace": "", 
    }, 
... 
} 
2

им не уверен, если это поможет, но в упругом определении опоясывающего лишая, вы можете использовать параметр filler_token, который по умолчанию _. установить его, например, пустая строка:

$indexParams['body']['settings']['analysis']['filter']['shingle-filter']['filler_token'] = ""; 

https://www.elastic.co/guide/en/elasticsearch/reference/1.7/analysis-shingle-tokenfilter.html