1

我使用 Haystack 和 ElasticSearch 作为后端在我的 Django 应用程序中实现搜索。我不明白它如何处理词干。我的索引模型在其文本中包含“嵌入”一词。搜索“嵌入式”会产生正确的结果。搜索“嵌入”一无所获。

我正在以文档显示的最简单方式进行查询:

SearchQuerySet().filter(content='embed')

我深入研究了代码,发现 ElasticSearch 被击中:

import requests
url = 'http://127.0.0.1:9200/haystack/modelresult/_search?from=0&size=20'
kwargs = {"data": '{"query": {"filtered": {"filter": {"fquery": {"query": {"query_string": {"query": "django_ct:(component_catalog.component)"}}, "_cache": true}}, "query": {"query_string": {"query": "(embed)", "default_operator": "AND", "default_field": "text", "auto_generate_phrase_queries": true, "analyze_wildcard": true}}}}}', "timeout": 10}
requests.get(url, **kwargs)

问题:

为什么 Haystack 不返回词干结果?

是什么(embed)意思?

4

1 回答 1

1

query_string使用Lucene 的查询语法,因此(embed)表示围绕“嵌入”的逻辑分组。来自 Lucene 文档,这是一个示例:

(jakarta OR apache) AND website

对于您的情况,您可以忽略它。这可能是 Haystack 自动插入的东西。

我的第一个倾向是说您的映射不正确。你是如何分析和索引你的领域的?您是否使用了 Snowball 词干分析器?

您可以使用 curl 来测试各种分析器的响应方式,当您没有得到想要的结果时,这是一个方便的技巧:

curl -X GET "http://localhost:9200/test/_analyze?analyzer=snowball&pretty=true" -d "embedded"
{
   "tokens" : [ {
      "token" : "embed",
      "start_offset" : 0,
      "end_offset" : 8,
      "type" : "<ALPHANUM>",
      "position" : 1
    } ]
}
于 2012-08-01T03:54:11.027 回答