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"
            }
        }
    }
}

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

上一篇 下一篇

猜你喜欢

热点阅读