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
的结果组成,它还为我提供了一些与 ich
、che
、ndi
,等等
我什至尝试过使用 __exact
和 Exact
但所有 return 结果相同?
编辑:Index mapping, Index Setting
如何避免这种情况并仅提供术语 pondicherry
的结果?
好像跟这个有关open issue
这是因为您的 search_auto
ngram 字段具有相同的索引和搜索分析器,因此您的搜索词 pondicherry
在搜索时也会被 ngram 化。解决此问题的唯一方法是为您的 search_auto
字段设置不同的 search_analyzer
,standard
会很合适。
您可以更改 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'
这似乎解决了我的问题。
我有一个正在获取索引的仓库模型
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
的结果组成,它还为我提供了一些与 ich
、che
、ndi
,等等
我什至尝试过使用 __exact
和 Exact
但所有 return 结果相同?
编辑:Index mapping, Index Setting
如何避免这种情况并仅提供术语 pondicherry
的结果?
好像跟这个有关open issue
这是因为您的 search_auto
ngram 字段具有相同的索引和搜索分析器,因此您的搜索词 pondicherry
在搜索时也会被 ngram 化。解决此问题的唯一方法是为您的 search_auto
字段设置不同的 search_analyzer
,standard
会很合适。
您可以更改 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'
这似乎解决了我的问题。