我遇到了弹性搜索查询的问题.我希望能够对结果进行排序,但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 } } } }
提前致谢!
文档中的字段"title"是一个分析的字符串字段,它也是一个mutivalued字段,这意味着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" } } } }
现在,根据分析的 "标题"字段执行搜索,并根据not_analyzed "title.raw"字段进行排序
{ "sort": [{ "title.raw": {"order": "desc"} }], "query":{ "term": { "title": "pagos" } } }
这里有一个很好的解释:字符串排序和多字段