事例:如查询0~1000的结果集时,分页查询乱序,会搜索出来,也会搜索不出来,目前查询到的结果是分片不一致导致的,需要指定唯一分片查询
ES中基于分片的搜索方式,是分2个阶段进行的,即Query阶段和Fetch阶段。 ES的搜索类型有2种;
- query then fetch(默认的搜索方式) 基于当前分片
- DFS query then fetch 基于索引
三种分页方式(From+size、Scroll、search_after )无论哪一种都是不会因为分片不一致导致查询数据无法返回的问题; 三种分页都是通过CoordinatingNode(协调节点)汇总的shard node(分片)上的数据,这个步骤就是Query阶段;不同的查询方式有不同的Fetch实现方式
因为ES的排序都是基于评分,而评分是基于当前分片的词频进行计算,每个分片节点的数据评分不一样;故而乱序了。 这种的话,我提供2种方式,可以解决因为查询乱序的问题,您可以尝试操作下:
- 基于当前查询结果进行重新评分排序 采用 “rescore” 针对结果集重新排序,具体用法可以自己网页查找;
GET tiku_question_index_4002/_search
{
"from": 0,
"size": 20,
"query" : {
"match": {
"questionContent": {
"query" : "预防"
}
}
},
"rescore" : {
"window_size" : 50,
"query" : {
"rescore_query" : {
"match_phrase" : {
"message" : {
"query" : "预防",
"slop" : 2
}
}
},
"query_weight" : 0.7,
"rescore_query_weight" : 1.2
}
}
}
- 第二种就是 不要基于分词的排序规则;而是建立一个专门用于排序的字段;将一个字段建立两次索引,一个分词,用来进行搜索;一个不分词,用来进行排序
PUT /website
{
"mappings": {
"properties": {
"title": {
"type": "text",
"fields": {
"raw": {
"type": "keyword",
"ignore_above": 256
}
},
"fielddata": "true"
}
},
...
}
}
GET /website/_doc/_search
{
"query": {
"match_all": {}
},
"sort": [
{
"title.raw": {
"order": "desc"
}
}
]
}
|