1、搜索语法
1、搜索条件and查询
GET student/java/_search{
"query":{
"match":{
"remark":{
"query":"1 2",
"operator":"and"}}}}
搜索:remark字段为1且为2的所有结果(默认的operator为or)
2、设置搜索条件中匹配的个数或者比例
GET student/java/_search{
"query":{
"match":{
"remark":{
"query":"1 2 3",
"minimum_shoud_match":2}}}}
搜索:remark字段搜索条件中(1 2 3)至少匹配两个条件
GET student/java/_search{
"query":{
"match":{
"remark":{
"query":"1 2 3",
"minimum_shoud_match":34%}}}}
搜索:remark字段搜索条件中(1 2 3)至少匹配1个条件(这里的百分比必须要大于除数(34% > 1/3))
使用bool和should也可以匹配搜索条件中的个数,但是写法较为冗余
GET student/java/_search{
"query":{
"bool":{
"should":[{"match:{"remark":"1"}"},
{"match:{"remark":"2"}"},
{"match:{"remark":"3"}"},]
"minimum_shoud_match":2
}
}
搜索:remark字段搜索条件中(1 2 3)至少匹配2个条件
- 通常情况下,第一和第二个方法使用match的多条件查询es的底层会将这中语法转化为bool should的语法(将里面的match在次转化为term,term会直接去倒排索引中查,效率会更快)
- 如果第一种情况中的operator为and,则会直接转换为bool must语法
- 如果比较在意速度,建议使用转换后的语法查询,效率更高
3、权重设置boost
GET student/java/_search{
"query":{
"bool":{
"must":[{"match":{"remark":"1"}]
"should":[{"match":{"remark":{"query":"2","boost":1}}},
{"match":{"remark":{"query":"3","boost":3}}}]
}}
搜索:remark字段搜索条件中(1 2 3)至少要有1。2,3条件同时满足时3的权重是2的权重3倍,也就是2,3同时满足时,满足3的结果要排在前面。
-
以上的相关度计算中,如果是在多shard中,则会出现相同数据,相同搜索条件,搜索出来的结果不同的数值。如果数量足够多的情况,各个shard计算出来的shard之间的误差会趋近于零。
-
相关度分数个个shard计算不准确的原因是:
相关度分数的计算是在shard本地计算的,个个shard中数据存储的是不同的(如果数据量大,则es会将数据均匀分布在各个shard上,可以视为存储数量相同)。例如:Ashard上存储了含有remark为1的docs有1K个,但是B shard上存储的有1W个。则根据TF-IDF算法,算出来的结果是不同的。 -
TF-IDF算法:词频 (TF) 是一词语出现的次数除以该文件的总词语数。假如一篇文件的总词语数是100个,而词语“母牛”出现了3次,那么“母牛”一词在该文件中的词频就是3/100=0.03。一个计算文件频率 (DF) 的方法是测定有多少份文件出现过“母牛”一词,然后除以文件集里包含的文件总数。所以,如果“母牛”一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是 log(10,000,000 / 1,000)=4。最后的TF-IDF的分数为0.03 * 4=0.12
-
如果是单shard 则不会出现问题
-
在开发测试中为了避免这样的情况,则可以在创建index的时候,setting设置为number_of_shards=1。也可以通过增加请求参数(search_type=dfs_query_then_fetch)来设置。此参数设置的原理是将所有shard的查询结果反馈到协调节点上,协调节点再统一计算相关度分数。这样的方式在生产环境要禁止使用,因为会消耗很多的内存和IO操作。
例如:
GET student/java/_search?search_type=dfs_query_then_fetch{
"query":{
"bool":{
"must":[{"match":{"remark":"1"}]
"should":[{"match":{"remark":{"query":"2","boost":1}}},
{"match":{"remark":{"query":"3","boost":3}}}]
}}
网友评论