023 elasticsearch查询数据 高亮 分页 中文分词器 field的数据类型

文章目录

    • 1查询的语法
    • 2查询全部数据
    • 3termQuery 关键词查询
    • 4QueryString查询,根据查询字符串查询
    • 5match查询,功能和query_string相同
    • 6multi_match查询
    • 7bool查询
    • 8高亮处理
    • 9查询结果分页
    • 10中文分词器
    • field的数据类型

1查询的语法

方法:post
url:http://localhost:9200/[/{blog}][/{type}]/_search
请求体:
json形式的查询语句

{
	"query":{
		"xxx"
	}
}

2查询全部数据

{
	"query":{
		"match_all":{}
	}
}

3termQuery 关键词查询

是所有查询中最基本的一个查询
根据关键词进行查询,如果关键词在索引中存在就有结果
如果关键词不存在就查询不到结果。ES不会再次对查询的内容进行分词处理
需要指定:

  1. 要查询的关键词
  2. 要查询的字段
{
	"query":{
		"term":{
			"title":"java"
		}
	}
}

默认使用的是standard分词器。处理英文根据空格进行分词处理。如果处理中文,是一个汉字一个关键词。

4QueryString查询,根据查询字符串查询

查询条件可以指定一个字符串,在查询之前,可以对查询条件进行分词处理,然后基于分词之后的结果再次查询

{
	"query":{
		"query_string":{
			"default_field":"title",
			"query":"第二轮开售|摩拳擦掌,笑迎五一"
		}
	}
}

5match查询,功能和query_string相同

{
	"query":{
		"match":{
			"title":"第二轮开售|摩拳擦掌,笑迎五一"
		}
	}
}

6multi_match查询

可以指定在多个字段中查询

{
	"query":{
		"multi_match":{
			"query":"第二轮开售|摩拳擦掌,笑迎五一",
			"fields":["title","content"]
		}
	}
}

7bool查询

  1. 组合条件查询
    逻辑关系:
    must:必须满足,相当于是AND
    should:应该满足,相当于OR
    must_not:必须不能满足,相当于NOT
    语法:
{
	"query":{
		"bool":{
			"must":[],
			"should":[],
			"must_not":[],
			"filter":[]
		}
	}
}

案例:

{
	"query":{
		"bool":{
			"must":[
				{
					"match":{
						"title":"apple"
					}
				},
				{
					"match":{
						"content":"apple"
					}
				}
			]
		}
	}
}
  1. filter过滤查询
    在bool查询的filter节点中可以包含多个查询条件,条件之间层层过滤
    也可以直接使用filter进行数据的查询。filter查询是不进行打分处理。查询性能高于query

     	相关度排序:
     		SEO:搜索引擎优化。
    
     		两个指标:
     			TF:关键词在文章中出现的频率。TF越大相关度越高。
     			DF:所有文档中关键词出现的频率。DF越大相关度越低。例如 and
     		根据TF和DF计算出一个相关度的得分,得分越高相关度越高,文档根据相关度得分进行降序排列。
    
{
	"query":{
		"bool":{
			"filter":[
				{
					"match_all":{}
				},
				{
					"term":{
						"title":"喜"
					}
				},
				{
					"term":{
						"title":"金"
					}
				},
				{
					"term":{
						"title":"北"
					}
				}								
				
			]
		}
	}
}

8高亮处理

在查询结果中将查询的关键词左右两边分别加上成对的html标签。
高亮的处理在查询条件中指定。
{
	"query":{
		"bool":{
			"must":[
				{
					"match":{
						"title":"apple"
					}
				}
			]
		}
	},
	"highlight":{
		"fields":{
			"title":{}
		},
		"pre_tags":"<em>",
		"post_tags":"</em>"
	}
}

9查询结果分页

在query查询条件中增加两个属性
from:起始的行号,从0开始
size:每页显示的记录数量

{
	"query":{
		"multi_match":{
			"query":"苹果正开发",
			"fields":["title","content"]
		}
	},
	"highlight": {
		"fields": {
		  "title": {},
		  "content": {}
		},
		"pre_tags": "<em>",
		"post_tags": "</em>"
	},
	"from": 10,
	"size": 5
}

10中文分词器

Ik-analyzer
https://github.com/medcl/elasticsearch-analysis-ik/releases

mkdir ik-analyzer
sudo yum install unzip
unzip elasticsearch-analysis-ik-7.10.2.zip -d ik-analyzer
cp ik-analyzer/ elasticsearch-7.10.2/plugins/ -R
方法:
	POST
url:
	http://localhost:9200/_analyze
方法体:
	{
		"analyzer":"standard",
		"text":"and productivity has made it the world's most popular Java framework."
	}

IK一旦安装之后有两个分词算法:
	ik_smart:快速分词,速度快,粒度比较粗。
	ik_max_word:最大数量分词,速度慢,粒度细。
索引一旦创建完毕不能修改分词器的
	如果使用中文分词,应该在创建索引时,设置mapping的过程中指定使用中文分词器。
PUT /blog1
{
	"mappings":{
		"properties":{
			"id":{
				"type":"long"
			},
			"title":{
				"type":"text",
				"analyzer":"ik_max_word",
				"store":"true"
			},
			"mobile":{
				"type":"keyword",
				"store":"true"
			},
			"comment":{
				"type":"text",
				"analyzer":"ik_max_word",
				"store":"true"
			},
			"content":{
				"type":"text",
				"analyzer":"ik_max_word",
				"store":"true"
			}			
		}
	}
}

POST /blog1/_bulk

field的数据类型

数值类型:
	int
	long
	float
	double
字符串:
	text:需要分词的字段必须使用text,只有text类型才能支持分词器。
	keyword:不需要对字段的内容进行分词处理时,可以使用keyword数据类型。
		例如:身份证号、手机号、订单号等。
日期:
	data

字段的三个属性:
	是否分词:
		是否是text类型。例如文章的title、content都需要分词。
	是否索引:
		是否对field的内容进行索引。如果text数据类型一定需要创建索引,分词之后一定要创建索引。
		不分词也可以把field的内容添加到索引中,使用keyword数据类型。
		也可以不索引field中的内容。
			例如文件的path,不需要分词,不需要索引,只需要存储即可。
			"path":{
				"type":"keyword",
				"index":false,
				"store":true
			}
	是否存储
		定义field时,store属性是否是true。
		如果是true那么就存储,false不存储。
		无论是否存储,不影响分词、创建索引、搜索。

		影响的范围就是是否能在查询结果中看到原始内容。
上一篇:信息与计算科学:“数学 + 计算机”,奏响未来科技新乐章