1

我正在使用 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 个用户:

  1. 杰克亨特,俄克拉荷马州,OK
  2. 杰克史密斯,亨茨维尔,AL

当我搜索“杰克亨特”时,我得到:

  1. 杰克史密斯,亨茨维尔,AL
  2. 杰克亨特,俄克拉荷马州,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 个字段上自动完成并为其中一个字段赋予更多权重?

4

0 回答 0