NgramField 根据查询词的子字符串返回结果

NgramField returning resutls based on substring of the query term

我有一个正在获取索引的仓库模型

class WarehouseIndex(SearchIndex, Indexable):
    """
    SearchIndex Class that stored indexes for Model Warehouse
    """
    text = CharField(document=True, use_template=True)
    search_auto = NgramField()
    ....

   def get_model(self):
        return WareHouse

在我的 shell 我是 运行 以下 sqs 查询。

>>> sqs = SearchQuerySet().models(WareHouse)
>>> sqs.filter(customers=3).filter(search_auto='pondicherry')

这个 return 的结果由没有确切术语 pondicherry 的结果组成,它还为我提供了一些与 ichchendi,等等

我什至尝试过使用 __exactExact 但所有 return 结果相同?

编辑:Index mapping, Index Setting

如何避免这种情况并仅提供术语 pondicherry 的结果?

好像跟这个有关open issue

这是因为您的 search_auto ngram 字段具有相同的索引和搜索分析器,因此您的搜索词 pondicherry 在搜索时也会被 ngram 化。解决此问题的唯一方法是为您的 search_auto 字段设置不同的 search_analyzerstandard 会很合适。

您可以更改 search_auto 字段映射:

curl -XPUT localhost:9200/haystack/_mapping/modelresult -d '{
   "properties": {
      "search_auto": {
         "type": "string",
         "analyzer": "ngram_analyzer",
         "search_analyzer": "standard"
      }
   }
}'

正如@Val 在上述回答中所述,错误是因为 search_analyzer 和 indexed_analyzer 相同导致了问题,

众所周知 haystack 在设置基本的 elasticsearch 配置时非常不灵活,我安装了 elasticstack 并在我的 setting.py 中将后端更改为 elasticsearch_backend按照建议,另外添加了以下 2 个配置

# elasticslack setting
ELASTICSEARCH_DEFAULT_ANALYZER = 'snowball'
ELASTICSEARCH_DEFAULT_NGRAM_SEARCH_ANALYZER = 'standard'   

这似乎解决了我的问题。