我不明白从elasticsearch/haystack返回的结果

use*_*688 13 django django-haystack 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)  
Run Code Online (Sandbox Code Playgroud)

我的文本文件如下:

{{ object.title }}
{{ object.text }}
{{ object.description }}
Run Code Online (Sandbox Code Playgroud)

我的疑问是

SearchQuerySet().models(IosVideo).filter(content="darby")[0]
Run Code Online (Sandbox Code Playgroud)

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

title: u'Cindy Daniels'
description: u'',
text: u'Cindy Daniels\n\n\n',
absolute_url: u'/videos/testimonial/cindy-daniels/'
Run Code Online (Sandbox Code Playgroud)

为什么在世界上查询会返回这样的结果?我很困惑.

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

我的pip信息是elasticsearch == 1.2.0 django-haystack == 2.3.1

弹性搜索版本号为1.3.1

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

它返回10个结果.

SearchQuerySet().filter(content="darby")  
Run Code Online (Sandbox Code Playgroud)

返回4k结果.

有谁知道会导致这种行为的原因是什么?

Ric*_*llo 4

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

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