如何使用多个字段搜索模型并为它们设置优先级?

时间:2017-09-06 15:45:41

标签: python django elasticsearch django-haystack solr-boost

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

  1. 杰克亨特,俄克拉荷马州,好的
  2. 杰克史密斯,亨茨维尔,AL
  3. 当我搜索“杰克亨特”时,我得到了:

    1. 杰克史密斯,亨茨维尔,AL
    2. 杰克亨特,俄克拉荷马州,好的
    3. 原因是这个城市。因此,如果名称匹配,我正在寻找提升用户的方法。

      我找到了一个解决方案。

      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个字段中自动完成并为其中一个字段提供更多权重?

0 个答案:

没有答案