下面我来详细讲解“Elasticsearch索引index之Mapping实现关系结构示例”的完整攻略。
什么是Elasticsearch索引index之Mapping
在Elasticsearch中,Mapping是用于定义数据结构、字段类型、分词器等属性的一种方式。它类似于关系型数据库中的表结构,可以定义索引内部的数据结构,以便更好地进行搜索和分析。Mapping可以帮助我们更好地优化搜索性能,正确地定义数据类型和分析器等属性,是Elasticsearch中重要的概念。
Mapping的实现
我们可以通过以下几个步骤来实现Mapping:
- 创建索引。首先需要创建一个索引,我们可以通过PUT请求来创建一个名为“test_index”的索引:
PUT /test_index
{
"settings": {
"index": {
"number_of_shards":1,
"number_of_replicas":0
}
}
}
- 设置Mapping。接下来需要设置索引的Mapping,我们可以通过PUT请求来设置Mapping。在Mapping中需要定义属性的名称、类型、分析器等:
PUT /test_index/_mapping
{
"properties": {
"name": {
"type": "text"
},
"age": {
"type": "integer"
}
}
}
上面的Mapping定义了两个属性:name、age,其中name的类型为text,age的类型为integer。Mapping中还可以定义很多其他的属性。
- 插入文档。最后需要向索引中插入数据,可以通过PUT请求来插入一条数据:
PUT /test_index/_doc/1
{
"name": "张三",
"age": 20
}
上面的请求向索引中插入了一条数据,其中name为“张三”,age为20。
Mapping实现关系结构示例
下面我们来看一个实现关系结构的示例,首先我们需要创建两个不同的索引,一个为“user_index”,一个为“order_index”。
用户索引
首先创建“user_index”,并设置Mapping。在此Mapping中,我们需要定义一个user字段和一个orderIds字段,其中orderIds字段类型为nested,表示它是一个嵌套对象类型。
PUT /user_index
{
"mappings": {
"properties": {
"user": {
"type": "text"
},
"orderIds": {
"type": "nested",
"properties": {
"orderId": {"type": "keyword"}
}
}
}
}
}
上面的Mapping设置了user字段的类型为text,orderIds字段的类型为nested,在orderIds中也定义了一个orderId字段,类型为keyword。
然后向用户索引中插入一些数据:
PUT /user_index/_bulk
{"index": {"_id": "1"}}
{"user": "张三", "orderIds": [{"orderId": "1001"}, {"orderId": "1002"}]}
{"index": {"_id": "2"}}
{"user": "李四", "orderIds": [{"orderId": "1003"}]}
{"index": {"_id": "3"}}
{"user": "王五", "orderIds": [{"orderId": "1002"}, {"orderId": "1003"}]}
上面的数据中,每个用户都有一个user属性和多个orderIds,orderIds中包含了多个orderId。
订单索引
然后创建“order_index”,并设置Mapping。在此Mapping中,我们需要定义一个orderId字段、一个productId字段和一个price字段,其中productId字段类型为text,price字段类型为float。
PUT /order_index
{
"mappings": {
"properties": {
"orderId": {"type": "keyword"},
"productId": {"type": "text"},
"price": {"type": "float"}
}
}
}
然后向订单索引中插入一些数据:
PUT /order_index/_bulk
{"index": {"_id": "1001"}}
{"orderId": "1001", "productId": "1001", "price": 10}
{"index": {"_id": "1002"}}
{"orderId": "1002", "productId": "1001", "price": 20}
{"index": {"_id": "1003"}}
{"orderId": "1003", "productId": "1002", "price": 30}
上面的数据中,每个订单都有一个orderId、一个productId和一个price。
查询数据
最后我们可以来查询一些数据,例如查询用户张三的订单:
GET /user_index/_search
{
"query": {
"match": {
"user": "张三"
}
},
"inner_hits": {
"highlight": {},
"size": 10,
"from": 0,
"name": "orders",
"path": "orderIds",
"query": {
"nested": {
"path": "orderIds",
"query": {
"match": {
"orderIds.orderId": "1001"
}
}
}
}
}
}
上面的请求中使用了inner_hits来查询用户张三的订单,查询结果包含了用户张三的信息以及他的订单信息。查询结果中用inner_hits的方式返回用户张三的每个订单信息。
另外一个示例是查询订单1003对应的用户,可以使用下面的请求:
GET /user_index/_search
{
"query": {
"nested": {
"path": "orderIds",
"query": {
"match": {
"orderIds.orderId": "1003"
}
},
"inner_hits": {
"_source": "user",
"highlight": {},
"size": 10,
"from": 0,
"name": "users"
}
}
}
}
上面的请求中查询了orderId为1003的订单对应的用户信息,查询结果中用inner_hits的方式返回了订单1003对应的用户信息。
以上就是“Elasticsearch索引index之Mapping实现关系结构示例”的完整攻略。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:elasticsearch索引index之Mapping实现关系结构示例 - Python技术站