创建索引,指定规则
映射:字段限制,设置字段的类型,是否索引(默认是true),是否设置分词器,是否存储到lucene(默认是false)。
关于是否存储到lucene,es默认会在_source里面存储数据,但是如果你的字段过多,你查询就相当于mysql里面的select * ,字段过多时会影响一点点性能,如果你存储到lucene,就可以select 具体哪几个字段。
PUT /article
{
"mappings":{
"_doc":{
"properties":{
"title":{
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer":"ik_max_word"
},
"desc":{
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer":"ik_max_word"
}
}
}
}
}
创建索引,设置分片和副本(设置索引设置(Settings): 索引设置包括分片数量、副本数量、分析器配置等。这些设置影响索引的性能和行为),
设置映射:
在Elasticsearch中,映射(Mapping)类型决定了字段如何被存储和索引。以下是一些常用的映射类型:
-
text
:- 用于全文搜索,可以被分词(tokenized)和搜索。
-
keyword
:- 用于结构化数据,例如数字、日期或精确字符串匹配,不会被分词。
-
date
:- 用于日期和时间。
-
integer
,long
,short
,byte
:- 用于整型数值。
-
double
,float
,half_float
,scaled_float
:- 用于浮点数值。
-
boolean
:- 用于布尔值(true/false)。
-
binary
:- 用于二进制数据。
-
nested
:- 用于嵌套对象,可以包含多个字段。
-
object
:- 用于对象类型,可以包含多个属性。
-
geo_point
:- 用于地理位置数据。
-
geo_shape
:- 用于地理空间数据。
-
ip
:- 用于IP地址。
-
completion
:- 用于自动完成功能。
-
token_count
:- 用于词项计数。
-
murmur3
:- 用于哈希字段。
-
percolator
:- 用于反向索引查询。
-
flattened
:- 用于扁平化嵌套对象的字段。
-
search_as_you_type
:- 用于自动分割文本字段,适用于自动完成和错误容忍搜索。
-
constant_keyword
:- 用于始终作为单个词项索引的关键词。
-
alias
:- 用于为字段创建别名。
每种映射类型都有其特定的用途和特点。例如,text
类型适合用于需要全文搜索的字段,而 keyword
类型适合用于需要精确匹配的字段。选择合适的映射类型对于优化Elasticsearch索引的性能和搜索结果的准确性至关重要。
请注意,Elasticsearch的版本更新可能会引入新的映射类型或弃用旧的映射类型。因此,建议查阅最新的Elasticsearch官方文档以获取最准确的信息。
PUT /my_index
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 1
},
"mappings": {
"properties": {
"title": {
"type": "text"
},
"date": {
"type": "date"
},
"content": {
"type": "text"
}
}
}
}
添加文档
当你想要创建一个新文档并指定其ID时,可以在索引请求的URL中包含文档ID。如果该ID的文档已经存在,请求将会失败,因为Elasticsearch不允许创建重复ID的文档。如下user是索引名,4是文档id
PUT /user/_doc/4
{
"name":"zhaoliu",
"age":30,
"about":"zhaoliu about"
}
批量添加
POST /phone/_doc/_bulk
{"index":{"_id":1}}
{"title":"王者荣耀阿古朵王者荣耀阿古朵怎么玩?阿古朵打野铭文出装以及团战技巧。阿古朵(13888金币)这个新英雄已经上线快一周了,出装和玩法差不多都完善了。王者荣耀官方给这个英雄定位是坦克或辅助,但是就目前来说走打野位置比较好,打野可以利用好他的被动,具体请看下文介绍。往往学会一个英雄的操作,熟悉该英雄技能是必须的,所以小编先简单的介绍一下阿古朵的技能。"}
{"index":{"_id":2}}
{"title":"王者荣耀老夫子怎么玩?老夫子铭文以及出装团战攻略","desc":"王者荣耀老夫子怎么玩?老夫子是一个边路有控有输出又肉的英雄,但是上场率目前来看并不是很高。会玩的老夫子是特别秀的英雄克星,边路带线偷塔以及团战开团能力都很强,8888金币就能买到,物有所值。本篇文章小编就来给大家介绍一下老夫子铭文以及出装团战开团技巧攻略。看更多攻略就来代练群。"}
{"index":{"_id":3}}
{"title":"王者荣耀后裔铭文出装打团技巧","desc":"王者荣耀后裔怎么玩?后裔大招怎么才能高命中敌方?关于这些问题本篇文章来介绍一下王者荣耀后裔的出装、铭文、打团等技巧。看更多王者荣耀英雄操作攻略就来代练群。"}
如果你不指定ID,Elasticsearch将自动生成一个唯一的ID。
POST /index_name/_doc
{
"field1": "value1",
"field2": "value2",
// ... 其他字段 ...
}
简单搜索操作
这个请求针对 user 索引进行全文搜索。如果你没有创建user索引那么搜索失效。
使用 match 查询在 about 字段上搜索包含“公司经理”这个词的文档。
highlight 部分指定了在搜索结果中,对于匹配的 about 字段内容进行高亮显示。
_doc:在 Elasticsearch 7.x 之前的版本中,这部分指定了文档类型。在 7.x 及以后的版本中,所有文档都属于 _doc 类型。直接写GET /user/_search
GET /user/_doc/_search
{
"query":{
"match":{
"about":"公司经理"
}
},
"highlight":{
"fields":{
"about":{}
}
}
}
这个请求针对 article 索引进行全文搜索。
使用 match_phrase 查询在 desc 字段上搜索包含短语“python语言”的文档。slop 参数指定了匹配的短语中的间隔最大距离,这里设置为 100,意味着短语中的词可以相隔不超过 100 个词元。
highlight 部分指定了在搜索结果中,对于匹配的 desc 字段内容进行高亮显示。
GET /article/_search
{
"query": {
"match_phrase": {
"desc": {
"query": "python语言",
"slop": 100
}
}
},
"highlight":{
"fields":{
"desc":{}
}
}
}
过滤结果,指定显示出哪些"_source"
GET /phone/_search
{
"query": {
"match_phrase": {
"desc": {
"query": "老夫子攻略",
"slop": 10
}
}
},
"_source": "desc"
}
排序操作
GET /phone/_search
{
"query": {
"match_phrase": {
"title": {
"query": "王者",
"slop": 10
}
}
},
"_source": "desc",
"sort": [
{
"_id": {
"order": "desc"
}
}
]
}
分页查询
GET /phone/_search
{
"query": {
"match_phrase": {
"title": {
"query": "王者",
"slop": 10
}
}
},
"_source": "desc",
"sort": [
{
"_id": {
"order": "desc"
}
}
]
, "from": 2,
"size": 1
}
多条件查询并且关系
GET /phone/_search
{
"query": {
"bool": {
"must": [
{
"match_phrase": {
"title": {
"query": "王者",
"slop": 10
}
}
},
{
"match_phrase": {
"desc": {
"query": "后裔",
"slop": 10
}
}
}
]
}
}
}
多条件查询或关系
GET /phone/_search
{
"query": {
"bool": {
"should": [
{
"match_phrase": {
"title": {
"query": "王者",
"slop": 10
}
}
},
{
"match_phrase": {
"desc": {
"query": "后裔",
"slop": 10
}
}
}
]
}
}
}
must_not不符合
过滤器查询
GET /phone/_search
{
"query": {
"bool": {
"should": [
{
"match_phrase": {
"title": {
"query": "王者",
"slop": 10
}
}
},
{
"match_phrase": {
"desc": {
"query": "后裔",
"slop": 10
}
}
}
],
"filter": {
"range": {
"FIELD": {
"gte": 10,
"lte": 20
}
}
}
}
}
}
修改文档
如果你想要更新一个已存在的文档,你需要使用该文档的现有ID来指定更新操作。
POST /index_name/_doc/your_specific_id/_update
{
"doc": {
"field1": "new_value1"
}
}
直接用PUT修改
覆盖的方法
第二种
POST /user/_doc/1/_update
{
"doc":{
"name":"张三"
}
}
删除文档
DELETE /index_name/_doc/your_specific_id
注意事项:
确保指定的ID是字符串格式,如果使用数字作为ID,它将被自动转换为字符串。
避免使用过长的ID,因为ID长度会影响性能。
考虑使用有意义的ID,这样在需要时可以更容易地识别文档。
通过在请求中指定ID,你可以更精确地控制文档的创建和更新过程。这在处理具有业务意义的标识符时特别有用,例如使用用户的ID或订单的ID作为文档ID。