我正在使用 Haystack 在数据库中搜索用户。我想检查用户名、城市名和州名(+ 州名)。
我已经使用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 个用户:
- 杰克亨特,俄克拉荷马州,OK
- 杰克史密斯,亨茨维尔,AL
当我搜索“杰克亨特”时,我得到:
- 杰克史密斯,亨茨维尔,AL
- 杰克亨特,俄克拉荷马州,OK
原因是城市。因此,如果名称匹配,我正在寻找提升用户的方法。
我找到了一种解决方案。
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)))
但是在搜索“Jack Hunt”之后,我没有找到来自 Huntsville 的 Jack Smith。因为他的名字不像“杰克亨特”,他的城市也不像“杰克亨特”。我知道我可以搜索每个单词。但它不是很“弹性”。
我该怎么做才能在 4 个字段上自动完成并为其中一个字段赋予更多权重?