0

目前我们使用 Django Haystack 和 Solr,但现在我们想将 Search Backend 切换到 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 并做同样的事情,但我们卡住了,因为我们无法像在 Solr 中那样配置 Ngram 字段。所以它总是没有做出正确的匹配。

那是什么意思。我们目前索引我们的模型 ID,因为每个模型都以大于 10000 的 ID 开头,所以当我在搜索 10001 之前,我会得到 ID 为 10001 的模型(即使使用 NGram)在 ElasticSearch 上我什么也没得到,只是找不到任何事物。我怎么能这样。

4

1 回答 1

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
     }
  }
}
于 2013-08-12T09:02:34.150 回答