【问题标题】:Haystack and ElasticSearch only exact searchHaystack 和 ElasticSearch 只进行精确搜索
【发布时间】:2013-08-13 01:20:16
【问题描述】:

目前我们使用 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 上我什么也没得到,它只是找不到任何东西。 我怎么能这样。

【问题讨论】:

  • 如果我理解正确,您会在“文本”字段的模板中呈现 id 吗?您应该在 search_index 中放入一个不是 ngram 的专用 obj_id 字段,以便进行精确搜索。

标签: elasticsearch django-haystack


【解决方案1】:

试试这样的

映射:

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

【讨论】:

    猜你喜欢
    • 2021-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-14
    相关资源
    最近更新 更多