Elasticsearch 是功能强大的全文搜索引擎,用它的目的就是为了能快速的查询你想好要的数据
基本查询:利用Elasticsearch内置查询条件进行查询
组合查询:把多个基本查询组合在一起的复合性查询
过滤:查询的同时,通过filter条件 在不影响打分的情况下筛选出想要的数据
基本查询:
1.term,terms查询
2.from,size
3.返回版本号_version
4.match查询
5.升序降序
6.prefix前缀匹配查询
7.range 范围查询
8.wildcard 通配符查询
9.fuzzy 模糊查询
10.more_like & more_like_this_field查询
查询某一个索引的映射信息:
eg:index:library
查询方式:
GET /library/_mapping ##会显示每个字段的类型信息
最简单的查询:
#指定index名以及type名的搜索,title 里面包含elasticsearch 关键字的文档,
GET /library/books/_search?q=title.elasticsearch
library 是索引字段值,books是type 字段值
##都不指定的搜索
GET /_search?q=title:elasticsearch
_score 是ES给搜索打的分值,分值越高越靠前,max_score是最高分。
“_shards”:{
“total”:5,
"successful":5,
"failed":0
},
total 是5个分片,successful 是从5个分片里面抽取结果组成,failed:0 是没有失败
“timed_out”false; 没有超时
1.term 查询
#term查询:查询 preview 字段里有某个关键词的文档
GET /library/books/_search
{
"query":{
"term":"
“preview”:"elasticsearch"
}
}
}
terms 查询:查询某个字段里有多个关键词的文档
miniumum_match:最小匹配集:
设置为1.说明两个关键词里面最少有一个
设置为2. 说明文档里这2个关键词都得存在
GET /library/books/_search
{
"query"{
"terms"{
"preview":["elasticsearch","book"]
“miniumu_match”:2
}
}
}
2.from,size
控制查询返回的数量
#相当于mysql 里面的limit
from:从哪个结果开始返回
size:定义返回最大的结果数
GET /library/books/_search
{
“from”:1, ##从第二个开始
"size":2, ##返回2个
"query":{
"term":"
“preview”:"elasticsearch"
}
}
}
3.返回版本号_version
GET /library/books/_search
{
“version”:true, #设置为true 显示版本
"query":{
"term":"
“preview”:"elasticsearch"
}
}
}
4.match查询
match 查询可以接受文字,数字日期等数据类型
match 和term的区别是,match 查询的时候,elasticsearch会根据你给定的字段提供合适的分析器,而term查询时不会有分析器分析的过程
GET /library/books/_search
{
"query"{
"match"{
"preview":"elasticsearch" ##字符串类型
}
}
}
GET /library/books/_search
{
"query"{
"match"{
"price":11 #数字类型
}
}
}
通过match_all查询
查询指定索引下的所有文档
GET /library/books/_search
{
"query"{
"match_all"{
"price":11 #数字类型
}
}
}
通过match_phrase查询
短语查询,slop定义的关键词之间隔多个未知的单词
查询elasticsearch,distributed 之间间隔2个单词的文档
GET /library/books/_search
{
"query"{
"match_phrase":{
"preview":{
"query":"Elasticsearch,distributed",
"slop":2
}
}
}
multi_match查询
可以指定多个字段
比如 查询title 和preview 这2个字段里都包含Elasticsearch 关键词的文档
GET /library/books/_search
{
"query"{
"multi_match":{
"query":"Elasticsearch",
"fields":["title","preview"]
}
}
指定返回的字段
GET /library/books/_search
{
“fields”:["preview","title"] ##这里指定要返回的字段
"query"{
"match":{
"preview":"elasticeearch"
}
}
}
通过partial_fields 控制加载的字段
GET /library/books/_search
{
“partial_fields”:{
"partial":{
"include":["preview"],
"exclude":["title","price"]
}
},
"query":{
"match_all":{}
}
}
还能加通配符
GET /library/books/_search
{
“partial_fields”:{
"partial":{
"include":["pre*"],
"exclude":["tit*"]
}
},
"query":{
"match_all":{}
}
}
5.升序降序
通过sort把结果排序
desc 降序
asc 升序
GET /library/books/_search
{
"query":{
"match_all":{}
},
"sort":[
{
"price":{ ##根据这个字段
"order":"desc" ##asc 升序
}
}
]
}
6.prefix前缀匹配查询
GET /library/books/_search
{
"query":{
"prefix":{
"title":{
"value":"r" ##匹配title 字段 r开头的
}
}
}
}
7.range 范围查询
有from ,to,include_lower,include_upper, boost 这些参数
include_lower: 是否包含范围的左边界,默认是true
include_upper:是否包含范围的右边界,默认是true
GET /library/books/_search
{
"query":{
"range":{
"publish_date":{ #时间字段
"from":"2015-01-01",
"to":"2015-06-30"
}
}
}
}
demo2:
GET /library/books/_search
{
"query":{
"range":{
"price":{ #价格字段
"from":"10",
"to":"20",
"include_lower":true, ##意思是包括10
"include_upper":false ###不包括20
}
}
}
}
8.wildcard 通配符查询
wildcard 查询:允许你使用通配符 * 和 ? 来进行查询
*代表一个或多个字符
? 仅代表一个字符
注意:这个查询功能影响性能
GET /library/books/_search
{
“query”:{
"wildcard":{
"preview":"rab*"
}
}
}
GET /library/books/_search
{
“query”:{
"wildcard":{
"preview":"luc?ne"
}
}
}
9.fuzzy 模糊查询
value :查询的关键字
boost: 设置查询的权值,默认是1.0
min_similarity :设置匹配的最小相似度
默认值为0.5:对于字符串,取值为0-1(包括0和1);对于数值,取值可能大于1;对于日期型,取值为1d,2d,1m这样,1d就代表1天
prefix_length:指明区分词项的共同匹配长度,默认是0
max_expansions:指明查询中的词项可扩展的数据,默认可以是无限大
##这个也是很耗资源
GET /library/books/_search
{
"query":{
"fuzzy":{
"preview":"rabit" ##preview 是要查询的字段值
}
}
}
demo2
GET /library/books/_search
{
"query":{
"fuzzy":{
"preview":{
"value":"rabit" , ##preview 是要查询的字段值
"min_similarity":0.5
}
}
}
}
fuzzy_like_this 查询
查询得到与给定内容相似的所有文档
fileds:字段组,默认是_all
like_text: 设置关键词
ignore_tf : 设置忽略词项的频次,默认是false
max_query_terns : 指明在生成的查询中查询词项的最大数据,默认是25
min_similarity: 指明区分词项最小的相似度,默认是0.5
prefix_length: 指明区分词项共同前缀的长度,默认是0
boost:设置权值,默认是1.0
analyze:指明用于分析给定内容的分析器
GET /library/books/search
{
"query":{
"fuzzy_like_this":{
"fileds":["preview"], ###可定义多个字段
"like_text":"open source software",
"min_similarity":0.5,
"prefix_length":0.2
}
}
}
fuzzy_like_this_field 查询
只作用在一个字段里
其它与fuzzy_like_this功能一样
GET /library/books/search
{
"query":{
"fuzzy_like_this_field":{
"preview":{ #只能一个字段
"like_text":"open source software",
"min_similarity":0.5,
"prefix_length":0.2
}
}
}
}
more_like_this 查询
fields: 定义字段组,默认是all
like_text :定义要查询的额关键词
percent_terms_to_match :该参数指明一个文档必须匹配多大比例的词项才被视为相似。默认值是0.3,意思是30%的比例
min_term_freq: 改参数指明在生成的查询中查询词项的最大数据。默认是25
stop_words:该参数指明将被忽略的单词集合
min_doc_freq:该参数指明词项应至少在多少个文档中出现才不会被忽略。more 是5
max_doc_freq: 该参数指明出现词项的最大数目,以避免词项被忽略。默认无限大
min_word_len: 该参数指明单个当个单词的最小长度,低于该值的单词将被忽略,默认是无限大。
max_word_len: 指明单个单词的最大长度,高于该值的单词将被忽略。默认是无限大
boost_terms:该参数指明提升每个单词的权重时使用的权值。默认是1
boost:指明提升一个查询的权值。默认是1.0
analyer:指明用于分析的分析器
GET /library/books/_search
{
"query":{
"more_like_this":{
"fields":["preview"], ##指定字段
"like_text":"apache open source",
"min_term_freq":1,
"min_doc_freq":1
}
}
}
同上面的类似,也有一个 more_like_this_field 查询
只作用在一个字段里
其它和more_like_this功能一样
GET /library/books/_search
{
"query":{
"more_like_this_field":{
"preview" :{
"like_text":"apache open source",
"min_term_freq":1,
"min_doc_freq":1
}
}
}
}
**
filter 查询
**
1.filter 查询语句
2.cache 缓存
filter 类似于 SQL 里面的where 语句,和上面的基础查询比起来,也能实现搜索的功能,同时 filter 可以将查询缓存到内存当中,这样可以大大加大下一次的查询速度
推荐使用filter
最简单的filter查询
select document FROM products WHERE price = 20
filtered 查询价格是20的商品
GET /store/products/_search ###store 索引名 products 商品名
{
"query":{
"filtered":{
"query":{
"match_all":{} ##匹配所有
}
"filter":{
"term":{
"price":20
}
}
}
}
}
也可以指定多个值
GET /store/products/_search ###store 索引名 products 商品名
{
"query":{
"filtered":{
"query":{
"match_all":{} ##匹配所有
}
"filter":{
"term":{
"price":[10,20] 指定多个值
###"productID":"sd24222222" 存在搜索不出来的情况,查看分析器解析的结果
}
}
}
}
}
#查看分析器解析的结果
GET /_analyze?text=SD24222222
查看分析的结果:
token 显示是小写,而我们搜索的是小写,那可能就查不到。
为什么会出现这种情况呢?是因为mapping 对字符串进行了分析,把大写的都变成了小写了。那如果就是想大写就能搜到呢?需要改map映射,重新建立一个映射,让productID处于not_analyzed模式
GET /store/_mapping ##查看映射
DELETE /store #删除映射,然后重新建立映射。
然后重新创建一下数据
PUT /store
{
"mappings":{
"products":{
"properties":{
"productID":{
"type":"string",
"index":"not_analyzed"
}
}
}
}
}
bool 过滤查询,可以做组合过滤查询
select product FROM products where (price = 20 OR productID = “SD1002136” AND (price !=30)
查询价格等于20的或者productID为SD453523的商品,排除价格30元的
类似的,Elasticsearch 也有 and,or ,not 这样的组合条件的查询方式
格式如下:
{
"bool":{
"must": [],
"should":[],
"must_not":[],
}
}
must:条件必须满足,相当于 and
should 条件可以满足也可以不满足,相当于 or
must_not :条件不需要满足,相当于 not
GET /store/products/_search
{
"query":{
"fltered":{
"filter" :{
"bool":{
"should":[
{"term":{"price":20}},
{"term":{"productID":"SD1002136"}}
], ###或运算,满足其中一个
"must_not":{
"term":{"price":30}
}
}
}
}
}
}
嵌套查询
SELECT document FROM products WHERE productID = “SD1002136” OR (productID = “sd4535233” AND price = 30)
GET /store/products/_search
{
"query":{
"fltered":{
"filter" :{
"bool":{
"should":[
{"term":{"productID":"sd1002136"}},
{"bool":{
"must":[
"term":{"productID":"SD1002136"}},
"term":{"price":30}}
]
}
}
}
}
}
另外一种 and,or,not查询
就是说没有bool,直接使用and,or,not
查询价格即是10元,productID又为SD1002136的结果
GET /store/products/_search
{
"query":{
"filtered":{
"filter":{
"and":[
{
"term":{
"price":10
}
},
{
"term":{
"productID":"sd1002136"
}
}
]
},
"query":{
"match_all":{} ###把所有的文档结果匹配之后再做一次匹配过滤
}
}
}
}
查询价格即是10元或productID又为SD1002136的结果
GET /store/products/_search
{
"query":{
"filtered":{
"filter":{
"or":[
{
"term":{
"price":10
}
},
{
"term":{
"productID":"sd1002136"
}
}
]
},
"query":{
"match_all":{} ###把所有的文档结果匹配之后再做一次匹配过滤
}
}
}
}
not
查询productID不是SD1002136的商品
GET /store/products/_search
{
"query":{
"filtered":{
"filter":{
"not":[
{
"term":{
"price":10
}
},
]
},
"query":{
"match_all":{} ###把所有的文档结果匹配之后再做一次匹配过滤
}
}
}
}
range 范围查询
SELECT document FROM products WHERE price BETWEEN 20 AND 40
ge : > 大于
lt: < 小于
gte: >= 大于等于
lte: <= 小于等于
GET /store/products/_search
{
"query":{
"filtered":{
"filter" :{
"range":{
"price":{
"gte":20,
"lt":40
}
}
}
}
}
}
建立数据
过滤空和非空
处理null空值的方法
SELECT tags FROM test WHERE tags IS NOT NULL
SELECT tags FROM test WHERE tags IS NULL
GET /test_index/test/_search
{
"query":{
"filtered":{
"filter":{
"exists":{"field":"tags"} ##查询非空的情况
}
}
}
}
GET /test_index/test/_search
{
"query":{
"filtered":{
"filter":{
"missing":{"field":"tags"} ##查询都为空的
}
}
}
}
cache 缓存
ES在执行带有filter查询时,会打开索引的每个segment文件(Lucene式底层文件),然后去判断里面的文档是否符合filter要求
注意:旧的segment文件不会变,新来的数据会产生新的segment
匹配的结果会用一个大型的BigSet数组来存储,这个数组的值只有0和1
匹配:1
不匹配:0
BigSet值是存在内存里的,而不是硬盘里,所以速度快
开启方式:在filter查询语句后面加上"_cache":true
注意:
Script filters,Geo-filters,Date ranges 这样的过滤方式开启cache无意义
exists,missing,range,term和terms查询是默认开启cache的
开启方式:
**
组合查询
**
1.bool查询
2.boosting 查询
3.constant_score查询
4.indices查询
bool 查询
1.bool查询
must,should,must_not
minimum_should_match: 表示一个文档至少匹配多少个短语才算是匹配成功
disable_coord: 弃用和禁用一个文档中所包含所有查询关键词的得分计算。默认是false
无Coordination 效果
含有apple的文档 -> 分值:1.5
含有apple jobs的文档 -> 分值:3.0
含有apple jobs mobile的文档 -> 分值:4.5
多一个词 分值多1.5
有Coordination 效果
含有apple的文档 -> 分值:1.5 *1/3 = 0.5
含有apple jobs的文档 -> 分值:3.0 * 2/3 = 2.0
含有apple jobs mobile的文档 -> 分值:4.5 * 3/3 = 4.5
2.boosting 查询
将2个查询封装在一起,然后可以降低一个查询结果返回的分值
positive 部分:查询返回的查询结果分值不变
negative 部分:查询的结果分值会被降低
negative_boost部分:设置 negative 中药降低的分值
优点:里面的2个查询都会有结果返回,其中一个分值就是你设置的分值
注意:如果是设有bool的must_not的话,那降低的那部分就没有结果返回
3.constant_score查询
优点:可以让一个查询得到一个恒定的分值
GET /library/books/_search
{
"query""{
"term":{
"title":"elasticsearch"
}
}
}
GET /library/books/_search
{
"query":{
"constant_score":{
"query":{
"term":{
"title":"elasticsearch"
}
}
}
}
}
观察 _score的分值,第一个是变化的,第二个是恒定的值
4.indices查询
优点:可以在多个索引上进行查询
只有一个参数:no_match_query
查询其他索引里的数据
eg:
GET /_search
{
"query":{
"indices":{
"indices":["library"],
"query":{
"term":{
"title":"elasticsearch"
}
},
"no_match_query":{
"term":{
"price":10
}
}
}
}
}
查询到的结果有别的索引里面的price 值为10 的,也有library 里面的匹配到的值。