美文网首页
ES文档级查询匹配限制

ES文档级查询匹配限制

作者: 郭彦超 | 来源:发表于2020-04-10 18:17 被阅读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

相关文章

网友评论

      本文标题:ES文档级查询匹配限制

      本文链接:https://www.haomeiwen.com/subject/wvkdmhtx.html