我正在使用Haystack搜索数据库中的用户。我想检查用户名,城市和州(+ abbr of state)。
我使用 ElasticSearchEdgeNgramField 完成了自动填充功能。
# search_indexes.py
class SwimmerIndex(indexes.SearchIndex, indexes.Indexable):
text = indexes.CharField(document=True, use_template=True)
name = indexes.CharField(model_attr='get_display_name')
name_auto = ElasticSearchEdgeNgramField(use_template=True, template_name='search/indexes/sdif/swimmer_text.txt', index_analyzer="edgengram_analyzer", search_analyzer="standard_analyzer")
# swimmer_text.txt
{{ object.get_full_nickname }}
{{ object.state }} {{ object.get_state_display }}
{{ object.city }}
搜索。
sqs = sqs.autocomplete(name_auto=request.GET.get('q', ''))
我在数据库中有2个用户:
当我搜索“杰克亨特”时,我得到了:
原因是这个城市。因此,如果名称匹配,我正在寻找提升用户的方法。
我找到了一个解决方案。
nickname = indexes.CharField(model_attr='get_full_nickname', boost=1.125)
state = indexes.CharField(model_attr='state', boost=1.0)
state_display_name = indexes.CharField(model_attr='get_state_display', boost=1.0)
city = indexes.CharField(model_attr='city', boost=1.0)
遵循https://django-haystack.readthedocs.io/en/master/boost.html
的示例sqs = sqs.filter(SQ(name=AutoQuery(q)) | SQ(state=AutoQuery(q)) | SQ(state_display_name=AutoQuery(q)) | SQ(city=AutoQuery(q)))
但是在寻找“杰克亨特”后,我没有得到亨茨维尔的杰克史密斯。由于他的名字不像“杰克亨特”,他的城市不像“杰克亨特”。我知道我可以搜索每个单词。但它不是很“有弹性”。
如何在4个字段中自动完成并为其中一个字段提供更多权重?