问题原因:es索引是分片存储的,查询计算评分的时候,是每个分片单独计算的,所以会出现相同名称的人员评分不同的问题、
解决方案:
1、与产品沟通,当数据量足够大时,每个分片数据近似相同,则各个分片计算出来的评分会很相近
2、查询的时候增加查询条件(dfs_query_then_fetch),不让各个分片单独计算得分,而是统一计算,这样会有一定的性能影响,官方文档也不建议这么做https://www.elastic.co/guide/en/elasticsearch/guide/2.x/relevance-is-broken.html
searchRequest.searchType("dfs_query_then_fetch");
PUT /test2
{
"settings": {
"number_of_shards": 5,
"number_of_replicas": 1
},
"mappings": {
"test2": {
"dynamic_templates": [
{
"notanalyzed": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}
}
]
}
}
}
POST /test2/_bulk
{"index":{"_index":"test2","_type":"test2","_id":"d483a79610b943f9892f479e1e4df8081"}}
{"mediaTag":"美国,英国,船"}
{"index":{"_index":"test2","_type":"test2","_id":"d483a79610b943f9892f479e1e4df8082"}}
{"mediaTag":"美国,英国"}
{"index":{"_index":"test2","_type":"test2","_id":"d0ce8c0651024ff5b1114ec263384a7c2"}}
{"mediaTag":"美国,英国,士大夫,船"}
{"index":{"_index":"test2","_type":"test2","_id":"d0ce8c0651024ff5b1114ec263384a7c1"}}
{"mediaTag":"美国,英国,士大夫"}
{"index":{"_index":"test2","_type":"test2","_id":"40fa46a395674f0fab4dcac45d0be2cd3"}}
{"mediaTag":"美国,船"}
{"index":{"_index":"test2","_type":"test2","_id":"25854d6cdd3b424e9ac43f0efd29afd04"}}
{"mediaTag":"英国,船,士大夫"}
GET /test2/_search?search_type=dfs_query_then_fetch
{
"query": {
"bool": {
"must": [
{"match": {
"mediaTag": "英国,船"
}}
]
}
}
}
由于Elasticsearch的分片存储特性,查询时相同名称的数据评分可能不同。解决方法包括与产品团队沟通确保数据均匀分布,或者在查询时使用dfs_query_then_fetch方式统一计算评分,但后者可能影响性能。

2232

被折叠的 条评论
为什么被折叠?



