我使用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)
是什么意思?
答案 0 :(得分:1)
query_string
使用Lucene's query syntax,因此(embed)
表示围绕'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
} ]
}