Haystack和ElasticSearch只有精确搜索

时间:2013-08-11 18:01:19

标签: elasticsearch django-haystack

目前我们使用的是Django Haystack和Solr,但由于Cluster中的配置更简单,我们现在想将搜索后端切换到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并执行相同的操作,但我们Stuck因为我们无法像在Solr中那样配置Ngram字段。 所以它总是没有做出正确的匹配。

这意味着什么。 我们当前索引我们的模型ID,因为每个模型都以大于10000的ID开头,所以当我在搜索10001之前,我会得到ID为10001的模型(即使使用NGram) 在ElasticSearch上,我什么都没得到,它找不到任何东西。 我怎么能这样做。

1 个答案:

答案 0 :(得分:2)

尝试这样的事情

映射:

"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
     }
  }
}