文档查询之UrlSearch

1991/6/26 基础

# 1. URI Search请求形式

# 在浏览器中输入: http://elasticsearch:9200/test_db/_search?q=name:张

curl -XGET "http://elasticsearch:9200/test_db/_search?q=name:张"
1
2
3

# 2. 返回格式和说明

{
    //搜索请求耗费了多少毫秒
    "took":0, 
    //搜索是否超时,请求时可自定义timeout参数,如:/_search?timeout=10ms
    "timed_out":false,
    // 分片信息
    "_shards":{ 
       // 在查询中参与分片的总数
        "total":1, 
       // 成功的分片数量
        "successful":1,
       //跳过分片数量
        "skipped":0,
       //失败的分片数量
        "failed":0 
    },
    "hits":{
        "total":{
            //表示匹配到的文档总数
            "value":1,
            //描述value结果的准确性,当eq时准确,gte不准确
            "relation":"eq"
        },
        //相关度的匹配分数,分数越高月相关
        "max_score":1.0296195,
        "hits":[
            {
                "_index":"test_db",//索引名称
                "_type":"_doc",//文档类型
                "_id":"pkCkRHgBl3R2rXlflr9j",//文档ID,唯一
                //这条记录的匹配分数
                "_score":1.0296195,
                //结果集中的具体字段
                "_source":{
                    "name":"张三封",
                    "age":19,
                    "home":"北京昌平"
                }
            }
        ]
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

# 3. URI Search 参数列表

参数 描述
q 在全文中搜索str,q=str或者q=字段:str
df 指定在哪个字段查询,不指定时会对所有字段进行查询
analyzer 当分析查询字符串的时候使用的分词器.
sort 根据字段名排序,?sort=x:desc(倒序),默认正序
from 返回的索引匹配结果的开始值,默认为 0
size 搜索结果返回的条数,默认为 10
timeout 设置查询超时时间,单位ms(毫秒)如:?timeout=1ms
_source_includes 只返回索引中指定的列,多个列中间用逗号分开。 如:/_search?_source_includes=name,age
_source_excludes 返回结果中不包含的字段多个列中间用逗号分开。 如:/_search?_source_excludes=name,age
_score 是否返回字段信息,默认true:都返回
explain 在每个返回结果中,包含评分机制的解释,默认:false
terminate_after 设置每个分片中查询的最大条数,如果设置结果中会有一个terminated_early
search_type 搜索的类型,合适类型能提高搜索性能,类型有:dfs_query_then_fetch query_then_fetch,默认:query_then_fetch
default_operator 多个条件的关系,AND 或者 OR,默认为 OR

# 4. q

# 4.1 所有字段中搜索

# 对应浏览器输入
http://elasticsearch:9200/test_db/_search?q=张
1
2

# 4.2 指定字段中搜索

# 对应浏览器输入
http://elasticsearch:9200/test_db/_search?q=name:张

# 使用 http://elasticsearch:9200/test_db/_search?q=张&df=name一样可以实现一样的效果
1
2
3
4

# 4.3 多字段查询

# 查找名字中含有张、王的记录,(name like %张% or name like %王%)
http://elasticsearch:9200/test_db/_search?q=name:张 王

# 想查找name中有张、并且age=19的记录
http://elasticsearch:9200/test_db/_search?q=name:张 age:19&default_operator=AND
1
2
3
4
5

# 4.4 比较查询

# q=age:<=21 年龄小于等于21岁的
# q=age:>21  年龄大于21岁的
curl -XGET "http://elasticsearch:9200/test_db/_search?q=age:<=21"
1
2
3

# 4.5 范围查询

仅用数字类型,日期也是数字类型

表示符号

# [] : 表示闭区间
# {} : 表示开区间
1
2

使用示例

# 年
year:({2019 TO 2020]) 表示 2019 < year <= 2020。
year:([* TO 2020])    表示 year <= 2020。
year:({2019 TO *})    表示 year > 2019
1
2
3
4

# 4.6 布尔查询

表示符号

# +(%2B): 必须包含,注意+ 用 %2B(url encode) 表示
# -:不能包含
1
2

使用示例

# 名字中必须包含张
http://elasticsearch:9200/test_db/_search?q=name:(%2B张)
# 名字中包含张,但不包含三的
http://elasticsearch:9200/test_db/_search?q=name:(%2B张 -三)
# 名字中,即不包含张,也不包含三的
http://elasticsearch:9200/test_db/_search?q=name:(-张 -三)
1
2
3
4
5
6

# 4.7 词组查询

进行词组查询时,被查找的词必须用“”引住,引住后会被当成一个单词查询

# 查找包含 NO ABC,并且顺序一致的记录
http://elasticsearch:9200/test_db/_search?q="NO ABC"
1
2

# 5. analyzer(分词器)

系统默认分词器有:keywordstandardsimple等等,也支持第三方分词器,如IK

需要注意的是,在指定分词器参数的时候必须要使用q进行字段查询。

# 5.1 使用分词器: keyword

第一步: 先分析分词器:keyword,会把字符串张三封分词成什么样,如下图:

第二步: 使用分词器查询

# 对应浏览器输入
http://elasticsearch:9200/test_db/_search?q=张三封&analyzer=keyword
1
2

# 5.2 使用分词器: standard

第一步: 先分析分词器:standard,会把字符串张三封分词成什么样,如下图:

第二步: 使用分词器查询

# 对应浏览器输入
http://elasticsearch:9200/test_db/_search?q=张三封&analyzer=standard&df=name
1
2

# 6. sort(排序)

# 按照年龄正序
http://elasticsearch:9200/test_db/_search?sort=age
# 按照年龄倒序
http://elasticsearch:9200/test_db/_search?sort=age:desc
1
2
3
4

# 7. from,size(分页)

# 从索引0开始取一条数据
http://elasticsearch:9200/test_db/_search?from=0&size=1
# 从索引1开始取两条数据
http://elasticsearch:9200/test_db/_search?from=0&size=2
1
2
3
4

# 8. 返回字段处理

  • _source_includes=a,b: 指定只返回a,b字段
  • _source_excludes=a,b:指定不返回a,b字段
  • _score=false:什么字段都不返回
# _score中只返回 name,age
http://elasticsearch:9200/test_db/_search?_source_includes=name,age

# _score中除了home字段不返回,其他字段都返回
http://elasticsearch:9200/test_db/_search?_source_excludes=home

# _score中什么字段都不返回
http://elasticsearch:9200/test_db/_search?_score=false
1
2
3
4
5
6
7
8

# 9. 评分机制

# 对应浏览器输入
http://elasticsearch:9200/test_db/_search?q=&explain=true
1
2

# 10.设置分片返回数量

# 对应浏览器输入
http://elasticsearch:9200/test_db/_search?q=&terminate_after=1
1
2