type为text的字段才能够分词
RestAPI
查询所有索引
GET _cat/indices
查询索引movies的信息
GET movies
查询索引movies的字段相关信息
GET movies/_mapping
查询movies的部分数据
GET movies/_search
CRUD
增;
/1表示ID,如果没有对应的ID,就增加数据,如果存在,则修改
POST user/_doc/1
{
"age": 20,
"firstName": "Roden",
"lastName": "Jhson"
}
删
DELETE user/_doc/数据ID
改
修改原有的数据,或者给原有的数据添加字段
POST user/_update/1
{
"doc": {
"firstName":"Rodan",
"lastName": "Johson",
"addColunmn":"addInformation"
}
}
查
查询单条数据
GET user/_doc/数据ID
批量查询
GET _mget
{
"docs": [
{"_index":"movies", "_id":"104372"},
{"_index":"movies", "_id":"104374"}
]
}
分页查询
GET movies/_search
{
"from": 0,
"size": 20
}
批量插入
可以指定ID,也可以不指定ID
POST user/_bulk
{"index":{"_id": 23}}
{"firstName":"Will", "lastName":"Smith", "mobile": "123455"}
{"index":{}}
{"firstName":"Lily", "lastName":"Bob", "mobile": "98765"}
Request Body查询
- 以year的倒序排序,查询titile中包含有Beautiful或者Mind的数据, query只能单条件查询。
GET movies/_search
{
"sort": [
{
"year": {
"order": "desc"
}
}
],
# query中只能有一个条件
"query": {
"match": {
"title": "Beautiful Mind"
}
}
}
- 短语匹配,查询title中包含有 “Beautiful Mind” 这个短语的的电影,只显示title和year的信息
GET movies/_search
{
"query": {
"match_phrase": {
"title": "Beautiful Mind"
}
},
"_source":["title","year"]
}
- 多条件查询,必须使用bool
- must–>同时满足
GET movies/_search
{
"query": {
"bool": {
"must": [
{
"range": {
"year": {
"gte": 2017,
"lte": 2018
}
}
},
{
"match": {
"title": "Beautiful Mind"
}
}
]
}
}
}
查询"title"包含"beautiful""mind"其中一个字段或者"year"在2016~2017年之间的数据
- should–>满足其中一个
GET movies/_search
{
"query":{
"bool":{
"should":[
{
"match":{
"title":"Beautiful Mind"
}
},
{
"range":{
"year":{
"gte":2016,
"lte":2017
}
}
}
]
}
}
}
- query_string用法
匹配title中含有"Beautiful Mind"
GET movies/_search
{
"query":{
"query_string":{
"default_field": "title",
"query": "Beautiful Mind",
"default_operator": "AND" #不加默认是OR
}
}
}
5.term
实现精准匹配,查询title为Beautiful
的电影
GET movies/_search
{
"query": {
"term": {
"title": {
"value": "Beautiful"
}
}
}
}
- 多字段同时匹配
GET movies/_search
{
"query":{
"multi_match":{
"query":"beautiful mind Romance",
"fields":["title","genre"],
"type":"best_fields"
}
}
}
type值的三种取值:
- most_fields
- best_fields
- cross_fields
- most_fields
most_fields,综合多个field一起进行搜索,尽可能多地让所有field的query参与到总分数的计算中来,此时就会是个大杂烩,结果不一定精准某一个document的一个field包含更多的关键字,但是因为其他document有更多field匹配到了,所以排在了前面;
优点:将尽可能匹配更多field的结果推送到最前面,整个排序结果是比较均匀的
缺点:可能那些精准匹配的结果,无法推送到最前面
- best_fields
best-fields策略,主要是说将某一个field匹配尽可能多的关键词的doc优先返回回来(获取最佳匹配的field) - cross_fields
总结
query下的关键字
range->范围
match->匹配
match_phrase->匹配短语
multi_match->多字段匹配
bool->多条件
query_string-->匹配多个单词
term->精准匹配
推荐搜索
suggest下的关键字
term
phrase
completion-->用于前缀查询(自动补全功能)
GET movies/_search
{
"suggest":{
#自定义名字
"custom_name":{
#查询内容
"text":"life",
"term":{
"field":"title",
"suggest_mode":"always"
}
}
}
}
suggest_mode
的三种模式(只用term关键词才有)
- missing,当词典中找不到对应的索引信息,才推荐
- popular,会推荐频率高的类似的词,即使在词典中找得到索引信息
- always,表示总是推荐