我希望能够以一定顺序返回预输入项。例如,搜索Para应返回:
Para
Paracetamol Parafin LIQUID PARAFFIN ISOMETHEPTENE WITH PARACETAMOL
1)以搜索词para开头的建议应在顶部并按字母顺序排列
2)其余项目应按字母顺序显示在下方
Elasticsearch有可能吗?
如果我希望输出像这样:
Paracetamol Parafin Amber Paraffin ISOMETHEPTENE WITH PARACETAMOL LIQUID PARAFFIN
因此,所有包含前缀的术语都位于顶部,其他所有术语均按字母顺序排列。
这是我的建议(同样,您需要启用脚本):
PUT /test { "settings": { "analysis": { "analyzer": { "autocomplete": { "type": "custom", "tokenizer": "standard", "filter": [ "standard", "lowercase", "ngram" ] }, "search_ngram": { "type": "custom", "tokenizer": "keyword", "filter": "lowercase" } }, "filter": { "ngram": { "type": "ngram", "min_gram": 2, "max_gram": 15 } } } }, "mappings": { "test": { "properties": { "text": { "type": "string", "index_analyzer": "autocomplete", "search_analyzer": "search_ngram", "index_options": "positions", "fields": { "not_analyzed_sorting": { "type": "string", "index": "not_analyzed" } } } } } } }
POST test/test/_bulk {"index":{"_id":1}} {"text":"Paracetamol"} {"index":{"_id":2}} {"text":"Paracetamol xxx yyy zzz"} {"index":{"_id":3}} {"text":"Parafin"} {"index":{"_id":4}} {"text":"LIQUID PARAFFIN"} {"index":{"_id":5}} {"text":"ISOMETHEPTENE WITH PARACETAMOL"}
GET /test/test/_search { "query": { "match": { "text": "Para" } }, "sort": [ { "_script": { "type": "number", "script": "termInfo=_index[field_to_search].get(term_to_search.toLowerCase(),_POSITIONS);if (termInfo) {for(pos in termInfo){return pos.position}};return 0;", "params": { "term_to_search": "Para", "field_to_search": "text" }, "order": "asc" } }, { "text.not_analyzed_sorting": { "order": "asc" } } ] }
更新
对于您的更新问题, 即使我希望再发表一则文章 ,也可以使用以下查询:
{ "query": { "match": { "text": "Para" } }, "sort": [ { "_script": { "type": "number", "script": "termInfo=_index[field_to_search].get(term_to_search.toLowerCase(),_POSITIONS);if (termInfo) {for(pos in termInfo){if (pos.position==0) return pos.position; else return java.lang.Integer.MAX_VALUE}};return java.lang.Integer.MAX_VALUE;", "params": { "term_to_search": "Para", "field_to_search": "text" }, "order": "asc" } }, { "text.not_analyzed_sorting": { "order": "asc" } } ] }