2013-08-11 3 views
0

В настоящее время мы использовали Django Haystack и Solr, но теперь мы хотели переключить наш Backback на ElasticSearch из-за более легкой конфигурации в кластере.Хейстак и ElasticSearch только точный поиск

На Solr наше текстовое поле было nGram, чтобы иметь более нечеткий поиск и не использовать точное совпадение слов. Он был настроен так:

<field name="text" type="ngram" indexed="true" stored="true" multiValued="false" /> 
<fieldType name="ngram" class="solr.TextField" > 
    <analyzer type="index"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="15" /> 
    </analyzer> 
    <analyzer type="query"> 
    <tokenizer class="solr.KeywordTokenizerFactory"/> 
    <filter class="solr.LowerCaseFilterFactory"/> 
    </analyzer> 
</fieldType> 

Теперь мы пытаемся использовать ElasticSearch и сделать то же самое, но мы Штука, так как мы не можем настроить поле Ngram, как мы могли бы сделать в Solr. Так что он всегда не делал правильных совпадений.

Что это значит. В настоящее время мы индексируем наши идентификаторы моделей, так как каждая модель начинается с идентификатора более 10000, поэтому, когда я перед поиском 10001 я получил бы модель с идентификатором 10001 (даже с NGram) На ElasticSearch я ничего не получил, найти что-нибудь. Как я мог это сделать.

+0

если я правильно понимаю, вы придающие идентификатор в шаблоне поля 'текст'? Вы должны поместить в search_index выделенное поле obj_id, которое не является ngram для точного поиска. –

ответ

2

Попробуйте что-то вроде этого

Mapping:

"ngram":{ 
    "type":"string", 
    "search_analyzer":"lowercase_analyzer", 
    "index_analyzer":"nGram_index_analyzer" 
} 

настройки:

"analysis":{ 
    "analyzer":{ 
    "nGram_index_analyzer":{ 
     "tokenizer":"keyword", 
     "filter":[ 
      "lowercase", 
      "nGram_filter" 
     ] 
    }, 
    "lowercase_analyzer":{ 
     "tokenizer":"keyword", 
     "filter":[ 
      "lowercase" 
     ] 
    } 
    }, 
    "filter":{ 
    "nGram_filter":{ 
     "type":"nGram", 
     "min_gram":3, 
     "max_gram":15 
    } 
    } 
} 
Смежные вопросы