龙空技术网

Elasticsearch match精准查询(不分词)

贵哥说Java创业 12

前言:

眼前你们对“matchjava”大致比较讲究,我们都需要剖析一些“matchjava”的相关知识。那么小编在网络上汇集了一些关于“matchjava””的相关内容,希望姐妹们能喜欢,咱们一起来学习一下吧!

精确查询

# 精确查询,name字段类型是keyword,name字段值必须完全匹配[李四]才能查询出来,查询[李]或者[四]都没有没有结果返回的,因为keyword类型字段不会进行分词GET /index_name/_search{    "query":{        "match":{            "name":"李四"        }    }}# 输出结果{    "took":0,    "timed_out":false,    "_shards":{        "total":2,        "successful":2,        "skipped":0,        "failed":0    },    "hits":{        "total":{            "value":1,            "relation":"eq"        },        "max_score":1.2039728,        "hits":[            {                "_index":"index_name",                "_type":"_doc",                "_id":"KWcyrYYBhncLYm9cWbGB",                "_score":1.2039728,                "_source":{                    "id":1002,                    "name":"李四",                    "age":13,                    "desc":"我的自我描2述",                    "birthday":"2023-02-03"                }            }        ]    }}

精确度匹配

match 查询支持 minimum_should_match 最小匹配参数, 可以指定必须匹配的词项数用来表示一个文档是否相关。我们可以将其设置为某个具体数字(指需要匹配倒排索引的词的数量),更常用的做法是将其设置为一个百分数,因为我们无法控制用户搜索时输入的单词数量。

# 精确度匹配GET /index_name/_search{    "query":{        "match":{            "desc":{                "query":"超 人",                "minimum_should_match":"2"            }        }    }}# 输出结果{    "took":1,    "timed_out":false,    "_shards":{        "total":2,        "successful":2,        "skipped":0,        "failed":0    },    "hits":{        "total":{            "value":2,            "relation":"eq"        },        "max_score":3.2245533,        "hits":[            {                "_index":"index_name",                "_type":"_doc",                "_id":"2mc5rYYBhncLYm9cifcv",                "_score":3.2245533,                "_source":{                    "id":1003,                    "name":"王五",                    "age":14,                    "desc":"超人",                    "birthday":"2023-02-04"                }            },            {                "_index":"index_name",                "_type":"_doc",                "_id":"Rmc5rYYBhncLYm9c_fxA",                "_score":0.68324494,                "_source":{                    "id":1005,                    "name":"王五",                    "age":14,                    "desc":"超人的平凡人生",                    "birthday":"2023-02-04"                }            }        ]    }}

只会返回匹配上“超” 和 “人” 两个词的文档返回,如果 minimum_should_match 是1,则只要匹配上其中一个词,文档就会返回。

正向匹配度-使用百分比

比如"minimum_should_match":75%,可以配置一个百分比,至少optional clauses(可选子句)至少满足75%,这里是向下取整的。

比如有5个clause,5*75%=3.75,向下取整为3,也就是至少需要match 3个clause。注意:由于是向下取整,所以尤其针对短的query,我们把"minimum_should_match"设为大于100% 还是可以得到结果(如下,130*3=3.90,向下取整为3)。

# 正向匹配度-使用百分比GET /index_name/_search{    "query":{        "match":{            "desc":{                "query":"超 人 的",                "minimum_should_match":"130%"            }        }    }}# 输出结果{    "took":1,    "timed_out":false,    "_shards":{        "total":2,        "successful":2,        "skipped":0,        "failed":0    },    "hits":{        "total":{            "value":1,            "relation":"eq"        },        "max_score":0.97092706,        "hits":[            {                "_index":"index_name",                "_type":"_doc",                "_id":"Rmc5rYYBhncLYm9c_fxA",                "_score":0.97092706,                "_source":{                    "id":1005,                    "name":"王五",                    "age":14,                    "desc":"超人的平凡人生",                    "birthday":"2023-02-04"                }            }        ]    }}

标签: #matchjava