Elasticsearch分层排序

我希望能够以一定顺序返回预输入项。例如,搜索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"

}

}

]

}

以上是 Elasticsearch分层排序 的全部内容, 来源链接: utcz.com/qa/409067.html

回到顶部