PUT请求格式说明
PUT /index_name
{
"mappings": {
"properties": {
"field1": {
"type": "text",
"analyzer": "ik_smart",
"index": true
},
"field2": {
"type": "keyword",
"index": false,
"copy_to": "all"
},
"field3": {
"type": "integer"
},
"all": {
"type": "text",
"analyzer": "ik_max_word"
}
"nested_field": {
"properties": {
"nested_subfield": {
"type": "keyword"
}
}
}
// 可添加更多字段定义
}
}
}
映射属性说明
-
索引名称:
index_name
:要创建或更新的索引名称。
-
Mappings映射:
mappings
:包含了索引的映射定义,其中properties
定义了索引中的字段。
-
Properties属性:
-
在
properties
字段下,定义每个字段的类型和属性。 -
字段类型(type):
text
:用于全文搜索的文本字段,会被分析(如分词)。keyword
:精确匹配的关键字字段,不会被分析。integer
:整数类型字段。copy_to
属性指定将该字段的内容复制到all
字段中,以便于在搜索时统一检索。
-
分词器(analyzer):
- 用于处理文本字段的分析器,例如
ik_smart
用于中文智能分词。
- 用于处理文本字段的分析器,例如
-
是否索引(index):
true
:默认值,表示字段应该被索引,可以进行搜索。false
:表示字段不会被索引,无法进行搜索,但可以被存储和检索。
-
复合字段(nested properties):
- 通过在字段下嵌套
properties
定义复杂类型字段,如对象或嵌套文档。
- 通过在字段下嵌套
-
示例说明
field1
:文本字段,使用ik_smart
分词器进行分析,允许被索引。field2
:关键字字段,不进行分析,不被索引。field3
:整数字段,用于存储整数值。nested_field
:嵌套字段示例,定义了一个包含nested_subfield
的子属性,其类型为关键字。
以上是如何在Elasticsearch中使用PUT请求创建索引,并定义其映射(mappings)的详细说明。这些定义决定了索引如何存储和处理数据,是数据搜索和分析的基础。
这个请求示例展示了如何使用PUT请求来修改现有索引(heima
)的映射(_mapping
)。在Elasticsearch中,一旦索引创建后,通常不能直接修改现有字段的映射类型。但是,你可以通过重新定义整个字段的方式来近似修改映射。
请求说明
-
索引名称:
heima
:要修改映射的索引名称。
-
PUT请求:
- 使用PUT请求指定索引名称和
_mapping
端点来更新映射。
- 使用PUT请求指定索引名称和
-
Mappings映射:
- 在请求体中,使用
properties
字段重新定义name
字段的映射。
- 在请求体中,使用
-
Properties属性:
name
字段重新定义为一个包含fistname
和lastname
的复合字段。fistname
和lastname
字段的类型都设置为keyword
,这意味着它们是精确匹配的关键字字段。
示例说明
PUT /heima/_mapping
{
"properties": {
"name": {
"properties": {
"fistname": {
"type": "keyword"
},
"lastname": {
"type": "keyword"
}
}
}
}
}
在这个示例中:
name
字段被重新定义为一个对象类型的字段,其中包含了fistname
和lastname
两个子字段。- 每个子字段的类型都被设置为
keyword
,这表示它们是精确匹配的关键字字段,不会进行分析。
请注意,虽然可以通过重新定义整个字段来近似修改映射,但这个操作实际上是创建一个新的映射定义,替换了旧的映射。这意味着在执行这个请求后,旧的索引映射将会被完全替换为新的映射定义。
好的,我会为您提供更详细的说明,特别是关于query字段的可选项和range查询的可选字段。
- query字段详细说明:
query字段是Elasticsearch查询的核心,可以包含以下主要类型的查询:
a) match_all: 匹配所有文档
"match_all": {}
b) match: 单字段全文搜索
"match": {
"字段名": "查询值"
}
c) multi_match: 多字段全文搜索
"multi_match": {
"query": "查询值",
"fields": ["字段1", "字段2", ...]
}
d) term: 精确匹配
"term": {
"字段名": {
"value": "精确值"
}
}
e) range: 范围查询
"range": {
"字段名": {
"gte": 最小值,
"lte": 最大值
}
}
- range查询的可选字段说明:
range查询用于数值或日期范围搜索,包含以下可选字段:
- gt: 大于 (greater than)
- gte: 大于等于 (greater than or equal to)
- lt: 小于 (less than)
- lte: 小于等于 (less than or equal to)
示例:
"range": {
"age": {
"gt": 20,
"lt": 30
}
}
对于日期字段,还可以使用日期数学表达式:
"range": {
"date": {
"gte": "now-1d/d",
"lt": "now/d"
}
}
- 更多query类型:
f) bool: 复合布尔查询
"bool": {
"must": [ ... ],
"should": [ ... ],
"must_not": [ ... ],
"filter": [ ... ]
}
- must 、 should 、must_not、 filter、
- 后面可以使用 match_all 、match 、multi_match、geo_bounding_box、geo_distance、range、term、
g) fuzzy: 模糊匹配
"fuzzy": {
"字段名": {
"value": "近似值",
"fuzziness": 2
}
}
h) prefix: 前缀匹配
"prefix": {
"字段名": "前缀"
}
i) wildcard: 通配符匹配
"wildcard": {
"字段名": "通配符*模式"
}
j) geo_distance: 地理距离查询
"geo_distance": {
"distance": "10km",
"字段名": {
"lat": 40,
"lon": -70
}
}
完整查询示例:
GET /索引名/_search
{
"query": {
"bool": {
"must": [
{ "match": { "title": "搜索关键词" } }
],
"filter": [
{ "term": { "status": "published" } },
{ "range": { "publish_date": {
"gte": "2023-01-01",
"lte": "2023-12-31"
}
}}
]
}
},
"sort": [
{ "publish_date": { "order": "desc" } }
],
"from": 0,
"size": 10,
"highlight": {
"fields": {
"title": {}
}
}
}
这个查询示例结合了布尔查询、match查询、term过滤、range过滤、排序、分页和高亮功能,展示了Elasticsearch查询的强大和灵活性。
通过组合这些查询类型和参数,您可以构建出满足各种复杂搜索需求的查询。根据具体的应用场景,您可以选择合适的查询类型并调整参数来优化搜索结果。