1、数据准备
post /lib3/user { "name":"lisi", "address":"shandong", "age":18, "interests":"youyong shufa changge tiaowu", "birthday":"2001-01-19" } post /lib3/user { "name":"wangwu", "address":"zhejiang", "age":22, "interests":"youyong shufa", "birthday":"1997-01-19" } post /lib3/user { "name":"zhangsan", "address":"zhejiang", "age":20, "interests":"youyong shufa changge changpao", "birthday":"1999-08-29" } post /lib3/user { "name":"youyong", "address":"zhejiang", "age":20, "interests":"youyong shufa changge changpao", "birthday":"1999-08-29" }
测试一下
get /lib3/user/_search?q=name:lisi get /lib3/user/_search?q=name:wangwu&sort=age:desc
2、term查询和terms查询
精准查询term
term是代表完全匹配,即不进行分词器分析,文档中必须包含整个搜索的词汇
term query会去倒排索引中寻找确切的term,它并不知道分词器的存在。这种查询适合keyword 、numeric、date。
term:查询某个字段里含有某个关键词的文档
terms:查询某个字段里含有多个关键词的文档
a、term 和 terms 是 包含(contains) 操作,而非 等值(equals) (判断)
b、不知道分词器的存在,所以不会去分词,
c、所谓的包含是文档分词结果某个分词是否相等,即文档是否包含这个分词
d、因为是在分词结果中匹配,所以大写要转换为小写,大写字母是匹配不到
get /lib3/user/_search/ { "query":{"term":{ "interests":"youyong"}} } get lib3/user/_search/ { "query":{"terms":{"interests":["shufa","youyong"]}} }
3、控制查询返回的数量
get lib3/user/_search { "from":0, "size":2, "query":{ "terms":{ "interests": ["changge","tiaowu"] } } }
4、返回版本号
get lib3/user/_search { "version":true, "query":{ "term":{"interests": "changge"} } }
5、match查询
match和term的区别是,match查询的时候,elasticsearch会根据你给定的字段提供合适的分析器,而term查询不会有分析器分析的过程,match查询相当于模糊匹配,只包含其中一部分关键词就行 同时还要注意match系列匹配时,datatype要设置为text,否则不会开启分词
match query知道分词器的存在,会对filed进行分词操作,然后再查询
match_all:查询所有文档
multi_match:可以指定多个字段
match_phrase:短语匹配查询,ElasticSearch引擎首先分析(analyze)查询字符串,从分析后的文本中构建短语查询,这意味着必须匹配短语中的所有分词,并且保证各个分词的相对位置不变
GET lib3/user/_search { "query":{"match":{"age": 20}} } GET lib3/user/_search { "query":{"match":{"interests": "changge"}} } GET lib3/user/_search { "query":{ "match_all": {} } } GET lib3/user/_search { "query":{ "multi_match": { "query": "youyong", "fields":["interests","name"] } } } get lib3/user/_search { "query":{ "match_phrase":{"interests": "youyong shufa"} } }
6、指定返回的字段
get lib3/user/_search { "_source":["name","age"], "query":{ "match": { "interests": "changge" } } }
7、显示要的字段、去除不需要的字段、可以使用通配符*
get lib3/user/_search { "query":{ "match_all": {} }, "_source":{ "includes": "addr*", "excludes": ["name","bir*"] } }
8、排序
前缀匹配查询"match_phrase_prefix", 并使用sort实现排序:desc:降序,asc升序
GET /lib3/user/_search { "query": { "match_phrase_prefix": { "interests": "you" } }, "sort":[ { "age":{"order": "desc"} } ] }
9、 范围查询
range:实现范围查询
参数:from,to,include_lower,include_upper,boost
include_lower:是否包含范围的左边界,默认是true
include_upper:是否包含范围的右边界,默认是true
GET /lib3/user/_search { "query": { "range": { "birthday": { "from": "1990-10-10", "to": "2000-05-01", "include_lower": true, "include_upper": false } } } } GET /lib3/user/_search { "query": { "range": { "age": { "from": 18, "to": 25, "include_lower": true, "include_upper": false } } } }
10、wildcard查询
允许使用通配符* 和 ?来进行查询
*代表0个或多个字符
?代表任意一个字符
GET /lib3/user/_search { "query": { "wildcard": { "name": "wang*" } } } GET /lib3/user/_search { "query": { "wildcard": { "name": "li?i" } } }
11、fuzzy实现模糊查询
fuzzy 查询是 term 查询的模糊等价。
a、是 包含(contains) 操作,而非 等值(equals) (判断)。
b、不知道分词器的存在,所以不会去分词,
c、所谓的包含是文档分词结果某个分词是否包含,不是整个文档是否包含
d、因为是在分词结果中匹配,所以大写要转换为小写,大写字母是匹配不到
value:查询的关键字
boost:查询的权值,默认值是1.0
min_similarity:设置匹配的最小相似度,默认值为0.5,对于字符串,取值为0-1(包括0和1);对于数值,取值可能大于1;对于日期型取值为1d,1m等,1d就代表1天
prefix_length:指明区分词项的共同前缀长度,默认是0
max_expansions:查询中的词项可以扩展的数目,默认可以无限大
GET /lib3/user/_search { "query": { "fuzzy": { "interests": "chagge" } } } GET /lib3/user/_search { "query": { "fuzzy": { "interests": { "value": "chagge" } } } }
12、高亮搜索结果
GET /lib3/user/_search { "query":{ "match":{ "interests": "changge" } }, "highlight": { "fields": { "interests": {} } } }