使用haystack和引擎Elasticsearch(Django)无法使用EdgeNgramField自动完成

Jua*_*uan 6 python django django-haystack elasticsearch

我需要在模型字段中搜索子字符串值.我有一个Index和一个SearchQuerySet.

这是Elasticsearch配置.

HAYSTACK_CONNECTIONS = {
    'default': {
        'ENGINE': 'haystack.backends.elasticsearch_backend.ElasticsearchSearchEngine',
        'URL': 'http://127.0.0.1:9200/',
        'INDEX_NAME': 'haystack',
    },

}
Run Code Online (Sandbox Code Playgroud)

我的索引.

class ElementIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)

    #model fields
    title_element = indexes.EdgeNgramField(model_attr='title')
    clean_content = indexes.EdgeNgramField(model_attr='clean_content')
    def get_model(self):
       return Element

    def index_queryset(self, using=None):
        """Used when the entire index for model is updated."""
        return Element.objects.filter(updatetime__lte=datetime.datetime.now())
Run Code Online (Sandbox Code Playgroud)

我的自定义搜索.

SearchQuerySet().filter(title_element=clean_value)
Run Code Online (Sandbox Code Playgroud)

在我的数据库中,我有一个值"HolaMundoTest",如果我尝试通过'Hola'或'HolaM'搜索我找到了结果,但如果我尝试'Mundo'或'mundo'或'laMun'则没有匹配.

怎么了?我不明白.

来源http://django-haystack.readthedocs.org/en/v2.1.0/autocomplete.html

我在用:

  • -django 1.5.1
  • -django-草垛== 2.1.0
  • -elasticsearch-0.90.5
  • -pyelasticsearch == 0.6

谢谢你的回答 -

tuf*_*fla 4

当您使用 EdgeNgramField 时,这是预期的行为,因为它对空格进行标记并匹配以查询中的字符开头的文本。

为了获取查询“laMun”或“mundo”的结果,您应该使用 NgramField 而不是 EdgeNgramField。