美文网首页
es的常用语法(1)

es的常用语法(1)

作者: chanyi | 来源:发表于2021-05-09 16:47 被阅读0次

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

相关文章

网友评论

      本文标题:es的常用语法(1)

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