work hard work smart

专注于Java后端开发。 不断总结,举一反三。
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

ElasticSearch搜索

Posted on 2020-07-18 12:39  work hard work smart  阅读(225)  评论(0编辑  收藏  举报

1、准备数据

1) 创建索引

 

 

 

2) 创建mapping

 

 

 JSON数据如下

{
"properties": {
"id": {
"type": "long"
},
"age": {
"type": "integer"
},
"username": {
"type": "keyword"
},
"nickname": {
"type": "text",
"analyzer": "ik_max_word"
},
"money": {
"type": "float"
},
"desc": {
"type": "text",
"analyzer": "ik_max_word"
},
"sex": {
"type": "byte"
},
"birthday": {
"type": "date"
},
"face": {
"type": "text",
"index": false
}
}
}

  

3) 增加多条数据

http://192.168.127.130:9200/user/_doc/1001

 

 

 JSON如下": 

{
	"id": 1001,
	"age": 20,
	"username": "张三",
	"nickname": "小张",
	"money": 18.6,
	"desc": "我在中华学习网学习",
	"sex": 0,
	"birthday": "1920-07-14",
	"face": "https://www.baidu.com/imgs/08/heh.png"
}


然后修改id,增加多条数据

 

2、QueryString方式搜索

将搜索的字段和值拼接到Url中

根据索引中某个字段搜索 

根据desc搜索

GET请求 http://192.168.127.130:9200/user/_search?q=desc:中华

多条件搜索: 根据desc和age进行搜索

http://192.168.127.130:9200/user/_search?q=desc:中华&q=age:20

QueryString用的很少,复杂测查询参数难以构建,所以大多查询都会使用dsl进行查询更好。

 

3、DSL方式搜索

DSL: Domain Specific Language 特定领域语言,基于JSON格式的查询,查询更灵活,有利于复杂查询

1) 查询desc单个字段

http://192.168.127.130:9200/user/_doc/_search

 

 

 

2) 查询某个字段是否存在

 

 

4、查询所有和分页

1) 查询所有

GET   http://192.168.127.130:9200/user/_doc/_search

DSL方式查询所有, match_all

 

 

 

 

2) 查询指定要查询字段的所有数据

如下图,只查询id,nickname,age

 

 

 

3) 分页查询

 

 

 from 从第0条开始

size: 每页显示10条

 

4) head 可视化查询

 

 

 

5) term精确搜索

,把搜索的内容,如“中华学习网”作为一个整个关键词去搜索,不会做分词搜索

desc包括有“中华学习网”,就能查询到。 将term换成match后,“中华学习网”会进行分词,将所有匹配分词的结果都能查询出来。

{
	"query": {
		"term": {
			"desc": "中华学习网"
		}
	},
	"_source": [
		"id",
		"nickname",
		"age"
	]
	
}

  

terms 多个词语匹配检索

相当于tag标签查询,比如博客的文章打上了tag, “前端”,“后端”,“ElasticSerach”,完全可以用标签匹配查询

 

 

6) match_parse

match: 分词后只要有匹配就返回

match_parse: 分词结果必须是text字段分词中都包含,而且顺序必须相同,而且必须都是连续的。(搜索比较严格)

 

 

 大学后面要跟上研究生,如“大学毕业后去读研究生”

 

slops: 允许词语间跳过的数量

 

 

 大学和研究生之间还能有其它字符,如“大学毕业后,去读研究生“

 

7) match(operator)

operator

or: 搜索内容分词后,只要存在一个词语匹配就展示结果

and: 搜索内容分词后,都要满足词语匹配

 

 

minimum_should_match: 最低匹配精度,至少有[分词后的词语个数]x百分百,得出一个数据值取整。举个例子:当前属性设置为 70 ,若一个用户查询检
有10个词语,那么匹配度按照 10x70%=7,则desc中至少需要有7个词语匹配,就展示;若分词后有8个,则 8x70%=5.6,则desc中至少需要有5个词语匹
示。 
 
8) ids搜索
查询指定几个id的数据

 

 9) multi_match

满足使用match在多个字段中进行查询的需求

 

 

 boost

权重,为某个字段设置权重,权重越高,文档相关性得分就越高。通常搜索商品名称要比商品简介的权重更高。

权重的格式如下图所示

 

 

10) 布尔查询

可以组合多种查询

must: 查询必须匹配搜索条件,譬如 and

should: 查询匹配满足1个以上条件,譬如or

must_not: 不匹配搜索条件,一个都不要满足

例如:

{
	"query": {
		"bool": {
			"must": [
				{
					"multi_match": {
						"query": "中华学习网",
						"fields": ["desc", "nickname"]
					}
				},
				{
					"term": {
						"sex": 0
					}
				},
				{
					"term": {
						"birthday": "1920-07-14"
					}
				}
			]
		}
	},
	"_source": [
		"id",
		"nickname",
		"desc"
	]
	
}

  

11) 过滤器

money字段值大于30,并且小于100

 

 12)  排序

根据年龄降序

 

 

 多个字段排序

 

 

13) 高亮 highlight

 

 

 默认使用em标签,可以自定义标签,如span