ES 搜索(5)—— 常用查询语句

match_all query

#匹配所有文档,得分全为1.curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "query": {
        "match_all": {}
    }
}
‘

 boost改变得分

curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "query": {
        "match_all": { "boost" : 1.2 }
    }
}
‘

 不匹配任何文档

curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "query": {
        "match_none": {}
    }
}
‘

2.全文查询  full text query 执行查询之前先分析查询字符串 通常是文本字段查询

match_query

执行全文查询的标准查询,包括模糊匹配和短语或近似查询

GET /_search
{
    "query": {
        "match" : {
            "message" : "this is a test"
        }
    }
}


match_phrase

match查询类似,但用于匹配精确短语或单词近似匹配

GET /_search
{
    "query": {
        "match_phrase" : {
            "message" : "this is a test"
        }
    }
}
#指定分词器curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "query": {
        "match_phrase" : {
            "message" : {
                "query" : "this is a test",
                "analyzer" : "my_analyzer"
            }
        }
    }
}
‘


match_phrase_prefix

match_phrase查询一样,但在最后一个单词上做了通配符搜索。

GET /_search
{
    "query": {
        "match_phrase_prefix" : {
            "message" : "quick brown f"
        }
    }
}
#max_expansions控制可接受的后缀的数量,如10 返回10个结果
curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "query": {
        "match_phrase_prefix" : {
            "message" : {
                "query" : "quick brown f",
                "max_expansions" : 10
            }
        }
    }
}
‘


multi_match query

多字段查询

如果没有指定query field,查询时按照index.query.default_field默认字段查询。

一次查询最多支持1024个字段

multi_match的查询类型包括:

best_fields     查询与任何字段匹配的文档  _score来自最佳字段的文档

(默认type)

most_fields    查询与任何字段匹配的文档  _score来自每个字段的文档

cross_fields   不能使用模糊查询

phrase           在每个字段上执行match_phrase查询,_score来自每个字段

phrase_prefix 在每个字段上执行phrase_match_phrase查询,_score来自每个字段

#query String  和 query fieldcurl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
  "query": {
    "multi_match" : {
      "query":    "this is a test",
      "fields": [ "subject", "message" ]
    }
  }
}
‘
#包含通配符的多字段查询 query fields 为:title,first_name,last_namecurl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
  "query": {
    "multi_match" : {
      "query":    "Will Smith",
      "fields": [ "title", "*_name" ]
    }
  }
}
‘
#subject字段的重要性是message字段的三倍curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
  "query": {
    "multi_match" : {
      "query" : "this is a test",
      "fields" : [ "subject^3", "message" ]
    }
  }
}
‘
#通常best_fields得分为最佳匹配文档得分,如果指定了tie_breaker,则加上tie_breaker*_score for allother match field。也可以指定其他参数:analyzerboostoperatorminimum_should_matchfuzzinesslenientprefix_lengthmax_expansionsrewritezero_terms_querycutoff_frequencyauto_generate_synonyms_phrase_query and fuzzy_transpositionscurl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
  "query": {
    "multi_match" : {
      "query":      "brown fox",
      "type":       "best_fields",
      "fields":     [ "subject", "message" ],
      "tie_breaker": 0.3
    }
  }
}
‘#相当于执行

curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
  "query": {
     "dis_max": {
         "queries": [
              { "match": { "subject": "brown fox" }},
              { "match": { "message": "brown fox" }}
          ],
     "tie_breaker": 0.3
    }
  }
}

#operator为and要求所有字段都要匹配curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
  "query": {
    "multi_match" : {
      "query":      "Will Smith",
      "type":       "best_fields",
      "fields":     [ "first_name", "last_name" ],
      "operator":   "and"
    }
  }
}
‘#相当于执行(+first_name:will +first_name:smith) | (+last_name:will +last_name:smith)
#得分计算:每个match子句的分数相加,再除以match子句的个数curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
  "query": {
    "multi_match" : {
      "query":      "quick brown fox",
      "type":       "most_fields",
      "fields":     [ "title", "title.original", "title.shingles" ]
    }
  }
}
‘
#相当于执行
curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
  "query": {
    "bool": {
      "should": [
        { "match": { "title":          "quick brown fox" }},
        { "match": { "title.original": "quick brown fox" }},
        { "match": { "title.shingles": "quick brown fox" }}
      ]
    }
  }
}
‘
curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
  "query": {
    "multi_match" : {
      "query":      "Will Smith",
      "type":       "cross_fields",
      "fields":     [ "first_name", "last_name" ],
      "operator":   "and"
    }
  }
}
‘
#相当于
+(first_name:will  last_name:will)
+(first_name:smith last_name:smith)


common terms query 将查询词分为两种:

1.重要的 (more important low frequency)

3.不重要的(less important high frequency)通常为stopwords

minimum_should_match:2//默认为低频词

GET /_search
{
    "query": {
        "common": {
            "body": {
                "query": "this is bonsai cool",
                "cutoff_frequency": 0.001
            }
        }
    }
}
curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "query": {
        "common": {
            "body": {
                "query": "nelly the elephant not as a cartoon",
                "cutoff_frequency": 0.001,
                "minimum_should_match": {
                    "low_freq" : 2,
                    "high_freq" : 3
                }
            }
        }
    }
}
‘
#相当于
curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "query": {
        "bool": {
            "must": {
                "bool": {
                    "should": [
                    { "term": { "body": "nelly"}},
                    { "term": { "body": "elephant"}},
                    { "term": { "body": "cartoon"}}
                    ],
                    "minimum_should_match": 2
                }
            },
            "should": {
                "bool": {
                    "should": [
                    { "term": { "body": "the"}},
                    { "term": { "body": "not"}},
                    { "term": { "body": "as"}},
                    { "term": { "body": "a"}}
                    ],
                    "minimum_should_match": 3
                }
            }
        }
    }
}
‘

query_string 

curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "query": {
        "query_string" : {
            "default_field" : "content",
            "query" : "this AND that OR thus"
        }
    }
}
‘
curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "query": {
        "query_string" : {
            "fields" : ["content", "name"],
            "query" : "this AND that"
        }
    }
}
‘
curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "query": {
        "query_string" : {
            "fields" : ["city.*"],
            "query" : "this AND that OR thus"
        }
    }
}
‘


3.term query  按照存储在倒排索引中的确切词进行操作 常用于数字,

日期和枚举等结构化数据,而不是全文本字段


term query

查询特定字段中包含的特定术语的文档

boost 给定一个更高的相关性分值

term查询确切匹配倒排索引match相关匹配保存数据时,映射类型为text会按分词器分词结果存储在倒排索引中映射类型为keyword 不按分词器分词,整个词直接存储在倒排索引中。例如:https://www.elastic.co/guide/en/elasticsearch/reference/6.1/query-dsl-term-query.html

curl -XPOST ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
  "query": {
    "term" : { "user" : "Kimchy" }
  }
}
‘
curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "status": {
              "value": "urgent",
              "boost": 2.0
            }
          }
        },
        {
          "term": {
            "status": "normal"
          }
        }
      ]
    }
  }
}
‘


terms query

查询符合任何一个term的文档

过滤机制:

可指定参数:index、type、id、path、routing

curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "query": {
        "terms" : { "user" : ["kimchy", "elasticsearch"]}
    }
}
‘
curl -XPUT ‘localhost:9200/users/user/2?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "followers" : ["1", "3"]
}
‘
curl -XPUT ‘localhost:9200/tweets/tweet/1?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "user" : "1"
}
‘
curl -XGET ‘localhost:9200/tweets/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "query" : {
        "terms" : {
            "user" : {
                "index" : "users",
                "type" : "user",
                "id" : "2",
                "path" : "followers"
            }
        }
    }
}
‘

 terms_set query
curl -XPUT ‘localhost:9200/my-index?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "mappings": {
        "doc": {
            "properties": {
                "required_matches": {
                    "type": "long"
                }
            }
        }
    }
}
‘
curl -XPUT ‘localhost:9200/my-index/doc/1?refresh&pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "codes": ["ghi", "jkl"],
    "required_matches": 2
}
‘
curl -XPUT ‘localhost:9200/my-index/doc/2?refresh&pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "codes": ["def", "ghi"],
    "required_matches": 2
}
‘
#可根据minimum_should_match_field参数指定至少匹配的文档数字段
curl -XGET ‘localhost:9200/my-index/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "query": {
        "terms_set": {
            "codes" : {
                "terms" : ["abc", "def", "ghi"],
                "minimum_should_match_field": "required_matches"
            }
        }
    }
}
‘
#根据脚本指定至少匹配的文档数字段curl -XGET ‘localhost:9200/my-index/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "query": {
        "terms_set": {
            "codes" : {
                "terms" : ["abc", "def", "ghi"],
                "minimum_should_match_script": {
                   "source": "Math.min(params.num_terms, doc[‘required_matches‘].value)"
                }
            }
        }
    }
}
‘

4. range query  

TermRangeQuery 针对string字段

NumericRangeQuery 针对数据、日期字段

#gte大于等于 gt大于 lte小于等于 lt小于curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "query": {
        "range" : {
            "age" : {
                "gte" : 10,
                "lte" : 20,
                "boost" : 2.0
            }
        }
    }
}
‘


查询日期范围时,可以使用date math表达式

日期格式

时区问题

curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "query": {
        "range" : {
            "date" : {
                "gte" : "now-1d/d",
                "lt" :  "now/d"
            }
        }
    }
}
‘
curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "query": {
        "range" : {
            "born" : {
                "gte": "01/01/2012",
                "lte": "2013",
                "format": "dd/MM/yyyy||yyyy"
            }
        }
    }
}
‘
#2015-01-01 00:00:00将转为2014-12-31T23:00:00 UTC ;now不受时区影响
curl -XGET ‘localhost:9200/_search?pretty‘ -H ‘Content-Type: application/json‘ -d‘
{
    "query": {
        "range" : {
            "timestamp" : {
                "gte": "2015-01-01 00:00:00",
                "lte": "now",
                "time_zone": "+01:00"
            }
        }
    }
}
‘

   
   

原文地址:https://www.cnblogs.com/zhxdxf/p/8443691.html

时间: 2024-10-11 06:57:47

ES 搜索(5)—— 常用查询语句的相关文章

23个MySQL常用查询语句

一查询数值型数据: SELECT * FROM tb_name WHERE sum > 100; 查询谓词:>,=,<,<>,!=,!>,!<,=>,=< 二查询字符串 SELECT * FROM tb_stu  WHERE sname  =  '小刘' SELECT * FROM tb_stu  WHERE sname like '刘%' SELECT * FROM tb_stu  WHERE sname like '%程序员' SELECT * F

数据库常用查询语句写法(优化)

常用查询写法 Like like本身效率就比较低,应该尽量避免查询条件使用like: 原因: 对于like '%...%'(全模糊)这样的条件,是无法使用索引的,全表扫描自然效率很低: 由于匹配算法的关系,模糊查询的字段长度越大,模糊查询效率越低. 解决办法: 尽量避免模糊查询,如果因为业务需要一定要使用模糊查询,则至少保证不要使用全模糊查询,对于右模糊查询,即like '-%',是会使用索引的: 左模糊like'%...'无法直接使用索引,但可以利用reverse + function ind

MySQL常用查询语句汇总(不定时更新.......)

在这篇文章中我会通过一些例子来介绍日常编程中常用的SQL语句 目录: ## 1.数据库的建立 ## 2.常用查询 ## 1.数据库的建立 实例将ER图的形式给出: 由此转换的4个关系模式:                    注:下划线为直线为主键,下划线为红色虚线为外键 由此可以建立如下数据库: C: S: SC: T: 数据库的具体建立脚本请查看  我的github ## 2.常用查询 查询年龄最小的四个人(按年龄从小到大排序,如果年龄相同,按姓名顺序排序) SELECT * FROM s

mysql常用查询语句

基本语句 1.mysql   -u   root   -p                            数据库连接 2.create   databases  数据库名             创建数据库 3.drop   database   数据库名                 删除数据库 查询语句 4.SELECT * FROM 表名称                    查询表中所有数据 5.SELECT idcard,name FROM student        

MySQL常用查询语句(23个)

一查询数值型数据: SELECT * FROM tb_name WHERE sum > 100; 查询谓词:>,=,<,<>,!=,!>,!<,=>,=< 二查询字符串 SELECT * FROM tb_stu  WHERE sname  =  '小刘' SELECT * FROM tb_stu  WHERE sname like '刘%' SELECT * FROM tb_stu  WHERE sname like '%程序员' SELECT * F

常用查询语句

一查询数值型数据:  SELECT * FROM tb_name WHERE sum > 100;  查询谓词:>,=,<,<>,!=,!>,!<,=>,=<   二查询字符串  SELECT * FROM tb_stu  WHERE sname  =  '小刘'  SELECT * FROM tb_stu  WHERE sname like '刘%'  SELECT * FROM tb_stu  WHERE sname like '%程序员'  SE

收藏 23个MySQL常用查询语句

一查询数值型数据: SELECT * FROM tb_name WHERE sum > 100; 查询谓词:>,=,<,<>,!=,!>,!<,>=,<= 二查询字符串 SELECT * FROM tb_stu  WHERE sname  =  '小刘' SELECT * FROM tb_stu  WHERE sname like '刘%' SELECT * FROM tb_stu  WHERE sname like '%程序员' SELECT * F

全文搜索怎么给查询语句与文档相关性打分

朴素想法 用户输入一个查询query,query由若干词(term)组成,文档也由若干词(term)组成.那么怎么评判查询和文档的相关性的高低. 很朴素简单的想法就是文档中包含的term与查询query中包含的term,两者越多相同的则说明越相关.比如query为"animal cat",文档一内容为"cat dog bird animal",文档二内容为"cat dog bird tiger",则认为query与文档二的相关性比文档一的高. 词

数据库相关常用查询语句

1.查看数据库的版本 select @@version 2.查看数据库所在机器操作系统参数 exec master..xp_msver 3.查看数据库启动的参数 sp_configure 4.查看数据库启动时间 select convert(varchar(30),login_time,120) from master..sysprocesses where spid=1 查看数据库服务器名和实例名 print 'Server Name...............: ' + convert(v