我在使用Elasticsearch查询时遇到问题。我希望能够对结果进行排序,但是elasticsearch忽略了排序标签。这是我的查询:
{ "sort": [{ "title": {"order": "desc"} }], "query":{ "term": { "title": "pagos" } } }
但是,当我删除查询部分并仅发送排序标签时,它就可以工作。谁能指出正确的方法?
我还尝试了以下查询,这是我所拥有的完整查询:
{ "sort": [{ "title": {"order": "asc"} }], "query":{ "bool":{ "should":[ { "match":{ "title":{ "query":"Pagos", "boost":9 } } }, { "match":{ "description":{ "query":"Pagos", "boost":5 } } }, { "match":{ "keywords":{ "query":"Pagos", "boost":3 } } }, { "match":{ "owner":{ "query":"Pagos", "boost":2 } } } ] } } }
设定值
{ "settings": { "analysis": { "filter": { "autocomplete_filter": { "type": "ngram", "min_gram": 3, "max_gram": 15, "token_chars": [ "letter", "digit", "punctuation", "symbol" ] } }, "analyzer": { "default" : { "tokenizer" : "standard", "filter" : ["standard", "lowercase", "asciifolding"] }, "autocomplete": { "type": "custom", "tokenizer": "standard", "filter": [ "lowercase", "asciifolding", "autocomplete_filter" ] } } } } }
对应
{ "objects": { "properties": { "id": { "type": "string", "index": "not_analyzed" }, "type": { "type": "string" }, "title": { "type": "string", "boost": 9, "analyzer": "autocomplete", "search_analyzer": "standard" }, "owner": { "type": "string", "boost": 2 }, "description": { "type": "string", "boost": 4 }, "keywords": { "type": "string", "boost": 1 } } } }
提前致谢!
文档中的 “标题” 字段是一个 分析的 字符串字段,也是一个多值字段,这意味着Elasticsearch会将字段内容拆分为令牌,并将其分别存储在索引中。您可能想按字母顺序在第一项上对 “标题” 字段进行排序,然后在第二项上依此类推,依此类推,但是elasticsearch在排序时并没有此信息可供使用。
因此,您可以从以下位置更改 “标题” 字段的映射:
{ "title": { "type": "string", "boost": 9, "analyzer": "autocomplete", "search_analyzer": "standard" } }
变成这样的多字段映射:
{ "title": { "type": "string", "boost": 9, "analyzer": "autocomplete", "search_analyzer":"standard", "fields": { "raw": { "type": "string", "index": "not_analyzed" } } } }
现在,基于已 分析的 “ title” 字段执行搜索, 并 基于 not_analyzed的 “ title.raw” 字段进行排序
{ "sort": [{ "title.raw": {"order": "desc"} }], "query":{ "term": { "title": "pagos" } } }
它在这里得到了很好的解释:字符串排序和多字段