首先创建一个 索引 shop , 并创建 mappings
使用 url 方式查询
查询搜索的规范:
在索引后加上 _search ;
?q 代表是query ;
基于 desc 字段是查询
192.168.1.160:9200/shop/_search?q=desc:慕课网
多条件查询:
192.168.1.160:9200/shop/_search?q=desc:慕课网&q=age:20 desc包含有“慕课网”的字段,且 age=20
使用 DSL 查询
DSL 搜索,查询条件使用 josn格式。
POST 192.168.1.160:9200/shop/_doc/_search
json:
{
"query":{
"match":{
"desc":"慕课网"
}
}
}
DSL 关键字
exists 查询某个字段是否存在 query 代表查询
{
"query": {
"exists": {
"field": "desc"
}
}
}
key可以是一些es的关键字,也可以是某个field字段,后面会遇到
查询所有 (返回所有字段)
POST 192.168.1.160:9200/shop/_doc/_search
json:
{
"query":{
"match_all":{}
}
}
查询所有 (返回所需字段)
POST 192.168.1.160:9200/shop/_doc/_search
json:
{
"query":{
"match_all":{}
},
"_source":["id","nickname","age"]
}
查询 显示要的字段,去除不需要展示的字段
{
"query":{
"match_all": {}
},
"_source":{
"includes": "addr*",
"excludes": ["name","bir*"]
}
}
查询带分页
添加 from size 关键字。 from 是第几条 ; size 每页多少条。
POST 192.168.1.160:9200/shop/_doc/_search
json:
{
"query":{
"match_all":{}
},
"_source":["id","nickname","age"],
"from":0,
"size":10
}
term 精确搜索与 match 分词搜索
term 搜索的时候会把用户搜索内容,比如“慕课网”作为一整个关键词去搜索,而不会对其进行分词后再搜索。
match 会对 慕课网 先进行分词(其实就是全文检索),在查询,而term则不会,直接把 慕课网 作为一个整的词汇去搜索。match 搜索,比如 desc字段中有一个 “课” ,比如是 “上课” 就可以被搜索到。而 term 则必须是 “慕课网” 才可以被搜索到
{
"query": {
"term": {
"desc": "慕课网"
}
}
}
terms 多个词语匹配检索
{
"query": {
"terms": {
"desc": ["慕课网","学习",”一起“]
}
}
}
match_phrase
match:分词后只要有匹配就返回,
match_phrase:分词结果必须在text字段分词中都包含,而且顺序必须相同,而且必须都是连续的。(搜索比较严格)
slop:允许词语间跳过的数量
match 扩展 查询的百分比量
operator
- or:搜索内容分词后,只要存在一个词语匹配就展示结果
- and:搜索内容分词后,都要满足词语匹配
post http://192.168.1.160:9200/shop/_doc/_search
{
"query":{
"desc":{
"desc":"慕课网",
"operator": "or" 这个加不加都是一样效果,只要一个匹配就会展示
}
}
}
minimum_should_match
- minimum_should_match :最低匹配精度,至少有[分词后的词语个数]x百分百,得出一个数据值取整。举个例子:当前属性设置为 70% ,若一个用户查询检 有10个词语,那么匹配度按照 10x70%=7,则desc中至少需要有7个词语匹配,就展示;若分词后有8个,则 8x70%=5.6,则desc中至少需要有5个词语匹 示。 ‘
- minimum_should_match 也能设置具体的数字,表示个数
post http://192.168.1.160:9200/shop/_doc/_search
{
"query": {
"match": {
"desc": {
"query": "女友生日送我好玩的xbox游戏机",
"minimum_should_match": "60%" 也可以输入数字
}
}
}
}
ids 多id查询
根据 ids 来查询
post http://192.168.1.160:9200/shop/_doc/_search
{
"query": {
"ids": {
"type":"_doc",
"values":["1001","1002","1003"]
}
}
}
multi_match : 多个字段中匹配查询
”慕课网“ 在 desc ; nickname 两个字段中查询
提升字段权重 使用 ^
布尔查询 - 多重组合查询
可以组合多重查询
- must:查询必须匹配搜索条件,譬如 and
- should:查询匹配满足1个以上条件,譬如 or
- must_not:不匹配搜索条件,一个都不要满足。(里面多条件也是 and 形式,既不满足A条件,也不满足B条件,也不满足C条件)
- 这3个关键字,可以组合一起使用
这3个查询内容都是已数组方式传入
post http://192.168.1.160:9200/shop/_doc/_search
列如, must 即 字段 “desc” 和 “nickname” 包含 “慕课网” 字段 并且 sex=1
boost 为词汇查询加权重
数值越大,权重越高。搜索后,有个 _score 值就越高,搜索出来的排名也就会越高
post_filter 过滤器
对搜索出来后的数据作过滤。
对搜索出来的结果进行数据过滤。不会到es库里去搜,不会去计算文档的相关度分数,所以过滤的性能会比较高,过滤器可以和全文搜索结合在一起使用。 post_filter元素是一个顶层元素,只会对搜索结果进行过滤。不会计算数据的匹配度相关性分数,不会根据分数去排序,query则相反,会计算分数,也会按照分 使用场景:
- query:根据用户搜索条件检索匹配记录
- post_filter:用于查询后,对结果数据的筛选
- gte:大于等于
- lte:小于等于
- gt:大于
- lt:小于
对查询的数据筛选 money字段在 55.8 ~ 155.8的区间
sort 排序
对查询的数据,进行排序。排序一般对数值排序, 文本的排序一般不多
- asc 正序
- desc 倒叙
数值、keyword 都可以做排序。
text 文本不能做排序,因为做了分词。要给text字段做排序,需要给它添加一个附属属性。
如下, name 类型是 text , 但是又给它一个附属属性 keyword
当需要对 text 类型的字段做排序时 就是 字段.keyword。 如下:
搜索高亮显示
加上 highlight 标签。
"highlight": {
"fields": {
"desc": {} 这个就是需要高亮的字段
}
}
返回的格式默认是加了 <em> 标签。
自定义标签
"pre_tags": ["<tag>"],
"post_tags": ["</tag>"],
"highlight": {
"pre_tags": ["<span>"],
"post_tags": ["</span>"],
"fields": {
"desc": {}
}
}