ElasticSearch如何实现分块排序(完整版描述)

Zac90 发布于 2016/01/29 18:12
阅读 3K+
收藏 0
现有多个查询条件(或的关系):
A -- "match": { "districtId": "9" }
B -- "match": { "districtId": "56" }
C -- "match": { "districtId": "69" }

现在我想按价格(price)升序排序,但希望满足A条件的都排在前面。
即满足A条件的按价格升序排在前面,其余不满足A条件的按价格升序排在后面,相当于分两大块排序。

设定query boost,按_score优先排序,能解决一部分问题,但还有两种情况不知如何处理:
1.    districtId是个多值字段,我希望忽略Query自身的相关性打分,即三个Query只有三种分数。
比如:文档1的districtId字段为 ["9"] ,文档2的districtId字段为 ["8","9","10"] ,那么对于条件A,希望它们的相关性打分相同。
2.    如果有文档同时匹配的A和B(或C),那么希望它的相关性要和只匹配A的情况一样,不要排到最高。
总之就是:只要满足该条件A,就只按价格排序,不满足条件A的,也只按价格排序;
换句话说,若用相关性打分解决问题,就得确保打分只考虑query boost,并且不能叠加!

因为分页、聚合等操作要基于所有结果,分多次查询的话,很难处理。
请问如何在一次请求中,实现这个功能?
或者说ES是否支持这种简单粗暴的设定:满足某个条件的结果可以强制赋予最高的排序优先级?

还有一个衍生的问题,如果还有一个需求,比如条件D -- "match": { "onSale": "Y" },如果不满足该条件,则置底(相当于分三大块排序),是否可以用同一个套路解决?

卡在这个问题上好久了,希望高手不吝赐教!最好是详细的解决方案!
加载中
1
Medcl
Medcl
看看是你要的么?
GET /test2/_search
{
  "query": {
    "function_score": {
      "filter": {
        "terms": { "districtId": ["9","56","69"] }
      },
      "functions": [ 
        {
          "filter": { "term": { "districtId": "9" }}, 
          "weight": 5
        },
        {
          "filter": { "term": { "districtId": "56" }}, 
          "weight": 4
        },
        {
          "filter": { "term": { "districtId": "69" }}, 
          "weight": 2 
        }
      ],
      "score_mode": "first"
    }
  }
}




从来都
然后怎么按 price 排序
Zac90
Zac90
完美解决!
杨子江
杨子江
就是这个原理,还可以使用 script_score
0
从来都
然后再怎么按price 排序
0
smart152819
smart152819

夜行侠老师视频教学:es问题汇总
http://www.itjoin.org/
1、如何防止索引被删除
2、搜索的精准性控制
3、解决搜索中英文数字混合
4、搜索中in查询
5、安装问题
6、es源码内部是如何做到插件化扩展
7、统计时展示不全
8、搜索条件过多,内容过长报错
9、索引某一字段内容太大
10、自动补全设计
11、es的分布式如何实现RPC底层
12、es的分片机制
13、head插件的使用
14、es分片和副本级的是原理
15、如何做到只更新部分数
16、数组在index中如何制
17、es搜索结果窗口太大
18、group by里如何
19、es底层新增和删除索引的全过程
20、es底层检索的全过

返回顶部
顶部