Haystack Django Elasticsearch拼写

时间:2014-10-01 15:09:41

标签: django elasticsearch django-haystack

我在设置haystack / django / elasticsearch

时遇到两个问题
  1. 我从未从索引字段中获得结果,例如indices.CharField(model_attr =' title')并没有得到我的结果。只有当我在我的txt模板中放入{{object.title}}时,我才能获得匹配标题的结果

  2. 如果我的头衔是'foo'我从来没有得到结果,而我在后端设置中将INCLUDE_SPELLING设置设置为True。

  3. 文档没有说明这些案例的任何特殊内容,我的设置是根据haystack文档,我缺少什么?

    我的索引:

    class FooIndex(indexes.SearchIndex, indexes.Indexable):
        text = indexes.CharField(document=True, use_template=True)
        title = indexes.CharField(model_attr='title')  # never gets me results unless I add it to the template
    
        def get_model(self):
            return Foo
    

    我的设置:

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

2 个答案:

答案 0 :(得分:0)

1)如果您use_template=True仅将您放在template文件中的内容编入索引,那么请将您想要编入索引的所有字段放在那里。 2)添加INCLUDE_SPELLING后是否刷新了索引?

答案 1 :(得分:0)

确保您启用了拼写检查组件。

要做的第一件事是在SearchIndex类上创建一个镜像文本字段的特殊字段,但使用FacetCharField。这会禁用Solr执行的后处理,这可能会弄乱您的建议。建议如下:

class MySearchIndex(indexes.SearchIndex, indexes.Indexable):
    text = indexes.CharField(document=True, use_template=True)
    # ... normal fields then...
    suggestions = indexes.FacetCharField()

def prepare(self, obj):
    prepared_data = super(MySearchIndex, self).prepare(obj)
    prepared_data['suggestions'] = prepared_data['text']
    return prepared_data

完成此操作后,spelling_suggestions方法应返回相应的值。