【问题标题】:Why does Haystack returns non-stemmed results?为什么 Haystack 返回非词干结果?
【发布时间】:2012-07-20 06:53:06
【问题描述】:

我使用 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) 是什么意思?

【问题讨论】:

    标签: python django search elasticsearch django-haystack


    【解决方案1】:

    query_string 使用Lucene's query syntax,因此(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
        } ]
    }
    

    【讨论】:

    • 我能够通过使用 EdgeNgramField 获得我想要的东西。 Lucene 查询语法看起来像是接下来要学习的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-18
    • 1970-01-01
    相关资源
    最近更新 更多