2013-05-03 62 views
0

我已经配置Django干草堆与Elasticsearch搜索引擎使用QueuedSignalProcessorredis队列后端。一切工作,除了现在我有一些问题。我有两个对象在db中,它的标题是code fixescode fixess(最后有额外的s)。我需要执行部分搜索。当我搜索code fix它返回对象与标题code fixes,但它不与标题code fixess返回对象:django干草堆没有按照期望返回结果

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,它会返回两者。

会是什么原因?

回答

0

的原因是因为草堆被配置为使用所述Snowball analyzer

这看起来为已知的(英语)词尾,如在fixeses和在索引中,而不是存储字(fix)确切的词,允许一种模糊匹配。

我认为雪球分析仪不会识别fixessess作为结尾,因此它不会将这个词修剪成词干。

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

最后,试试这个项目,这使得它更容易自定义Haystack使用的ElasticSearch配置:
https://github.com/bennylope/elasticstack