【问题标题】:I don't understand the results that's returning from elasticsearch/haystack我不明白从 elasticsearch/haystack 返回的结果
【发布时间】:2015-03-05 21:37:38
【问题描述】:

使用 elasticsearch 后端从 haystack 返回的结果对我来说似乎是错误的。我的搜索索引如下:

from haystack import indexes
from .models import IosVideo

class VideoIndex(indexes.SearchIndex, indexes.Indexable):                   
    text = indexes.CharField(document=True, use_template=True)              
    title = indexes.CharField(model_attr='title')                           
    absolute_url = indexes.CharField(model_attr='get_absolute_url')         
#    content_auto = indexes.EdgeNgramField(model_attr='title')              
    description = indexes.CharField(model_attr='description')               
#    thumbnail = indexes.CharField(model_attr='thumbnail_url', null=True)   

    def get_model(self):                                                    
        return IosVideo                                                     

    def index_queryset(self, using=None):                                   
        return self.get_model().objects.filter(private=False)  

我的文本文档如下所示:

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

我的查询是

SearchQuerySet().models(IosVideo).filter(content="darby")[0]

让我认为这不起作用的返回结果是具有以下特征的视频对象

title: u'Cindy Daniels'
description: u'',
text: u'Cindy Daniels\n\n\n',
absolute_url: u'/videos/testimonial/cindy-daniels/'

到底为什么查询会返回这样的结果?我很困惑。

我目前的理论是,它对查询中 char 的每个子集进行标记,并将其用作部分匹配。有没有办法降低这种容差以更接近匹配。

我的点子信息是 弹性搜索==1.2.0 django-haystack==2.3.1

并且elasticsearch版本号是1.3.1

另外,当我点击本地服务器时 http://localhost:9200/haystack/_search/?q=darby&pretty

它返回 10 个结果。

SearchQuerySet().filter(content="darby")  

返回 4k 结果。

有人知道什么会导致这种行为吗?

【问题讨论】:

  • 您是使用 elasticstack 还是自定义分析器?这可能解释了你所看到的结果。我确定你看到了,但从 Haystack 2.X 开始,过滤器中的默认查找是 contains,而不是 exact。再加上一个查看部分单词的分析器,可能会匹配该文档。
  • 没有自定义分析器 :( 我的 pip 看起来像这样 elasticsearch==1.2, django-haystack==2.3.1。elasticsearch 版本是 1.3.1
  • 有没有试过直接查询elasticsearch比较结果?例如http://localhost:9200/_search/?q=darby,其中search 是您的索引名称。
  • 您是否检查了 elasticsearch 中的索引文档包含的内容,在这种情况下,例如给 Cindy Daniels 的文件?
  • @LucasMoeskops localhost:9200/haystack/_search/?q=darby 返回 10 个结果,这些结果都不是 Cindy Daniels 对象。那么,Haystack 出了点问题,对吗?

标签: django elasticsearch django-haystack


【解决方案1】:

django-haystack 2.1.0 的 Charfield 索引上的 filter() 方法存在问题。您可以将它们改为 NgramField,例如 text = indexes.NgramField(document=True, template_name=True)

问题是当你使用这个组合时,你只会得到第一个字符。因此,它会返回所有在其文本索引字段中具有“d”的匹配项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-08
    • 2015-05-17
    • 2013-09-10
    • 2022-01-15
    • 2017-05-08
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    相关资源
    最近更新 更多