ES文档级查询匹配限制
2020-04-10 本文已影响0人
郭彦超
terms_set
terms_set 支持文档级匹配查询限制,terms_set 与terms query语句很类似,区别在于terms_set 可以做到细粒度查询控制,每个文档中可以指定一个数值类型的字段用来控制匹配的term数,例如
PUT /job-candidates
{
"mappings": {
"properties": {
"name": {
"type": "keyword"
},
"programming_languages": {
"type": "keyword"
},
"required_matches": {
"type": "long"
}
}
}
}
-
required_matches
required_matches用来做query时的匹配限制,如果某个文档中该值为2,那么terms_set 查询query中需要至少2个term匹配上才能返回该文档
PUT /job-candidates/_doc/1?refresh
{
"name": "Jane Smith",
"programming_languages": ["c++", "java"],
"required_matches": 1
}
PUT /job-candidates/_doc/2?refresh
{
"name": "Jason Response",
"programming_languages": ["java", "python"],
"required_matches": 2
}
GET /job-candidates/_search
{
"query": {
"terms_set": {
"programming_languages": {
"terms": ["c++", "java", "php"],
"minimum_should_match_field": "required_matches" ## 以文档中required_matches字段值为准
}
}
}
}
minimum_should_match_field 也可以换成minimum_should_match_script;minimum_should_match_script可以执行一个scrip脚本 ;由于minimum_should_match不能超过terms_set的长度,所以可以这么做:
GET /job-candidates/_search
{
"query": {
"terms_set": {
"programming_languages": {
"terms": ["c++", "java", "php"],
"minimum_should_match_script": {
"source": "Math.min(params.num_terms, doc['required_matches'].value)"
},
"boost": 1.0
}
}
}
}
其中 params.num_terms 对应terms_set的长度,doc['required_matches'].value对应文档中required_matches的value