0

我已经使用 Queue 后端配置了带有 Elasticsearch 搜索引擎的 Django QueuedSignalProcessorhaystack redis。一切正常,除了现在我有一些问题。我在 db 中有两个对象,其标题是code fixesand (末尾code fixess有额外)。s我需要执行部分搜索。当我搜索code fix它时返回带有标题的对象,code fixes但它没有返回带有标题的对象code fixess

my_model = SearchQuerySet().models(MyModel)
objects = my_model.filter(content__contains=q) # q = "code fix"

索引文件:

from haystack import indexes
from myapp.models import MyModel

class MyModelIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    title = indexes.CharField(model_attr="title")

索引模板:

{{ object.title }}
{{ object.description }}

PS索引已更新。好像我搜索fixess它会显示带有标题的第二个对象,code fixess但在这种情况下不是第一个。如果我只搜索code它会返回两者。

原因是什么?

4

1 回答 1

0

原因是因为 Haystack 被配置为使用Snowball 分析器

这会查找已知的(英语)单词结尾,例如esinfixes并将词干( fix) 存储在索引中而不是确切的单词,从而实现一种模糊匹配。

我认为 Snowball 分析器不会将essfrom识别fixess为结尾,因此它不会将单词修剪为词干。

ElasticSearch 实际上提供了许多其他分析器,并且还允许您从标记器 + 过滤器的构建块中定义自定义分析器。源数据中的拼写错误可能是一个棘手的问题......您可能需要尝试一种语音(“听起来像”)方法:
https ://github.com/elasticsearch/elasticsearch-analysis-phonetic

最后,试试这个项目,它可以更轻松地自定义 Haystack 使用的 ElasticSearch 配置:
https ://github.com/bennylope/elasticstack

于 2014-02-12T17:35:03.583 回答