为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Elasticsearch 中索引对象列表?

如何在 Elasticsearch 中索引对象列表?

慕哥6287543 2022-05-19 18:36:14
我摄取到 ElasticSearch 中的文档格式如下所示:{   'id':'514d4e9f-09e7-4f13-b6c9-a0aa9b4f37a0'   'created':'2019-09-06 06:09:33.044433',   'meta':{      'userTags':[         {            'intensity':'1',            'sentiment':'0.84',            'keyword':'train'         },         {            'intensity':'1',            'sentiment':'-0.76',            'keyword':'amtrak'         }      ]   }}...用 python 摄取:r = requests.put(itemUrl, auth = authObj, json = document, headers = headers)这里的想法是 ElasticSearch 将keyword,intensity和sentiment视为以后可以查询的字段。但是,在 ElasticSearch 方面,我可以观察到这并没有发生(我使用 Kibana 搜索 UI)——相反,我看到字段“meta.userTags”的值是整个对象列表。如何在列表中创建 ElasticSearch 索引元素?
查看完整描述

2 回答

?
德玛西亚99

TA贡献1770条经验 获得超3个赞

您不需要特殊的映射来索引列表 - 每个字段都可以包含一个或多个相同类型的值。请参阅数组数据类型

在对象列表的情况下,它们可以被索引为objectnested数据类型。默认弹性使用object数据类型。在这种情况下,您可以查询meta.userTags.keywordor/and meta.userTags.sentiment。结果将始终包含具有独立匹配值的整个文档,即。搜索keyword=trainsentiment=-0.76您将找到带有id=514d4e9f-09e7-4f13-b6c9-a0aa9b4f37a0.

如果这不是您想要的,您需要为 field 定义嵌套数据类型映射userTags并使用嵌套查询


查看完整回答
反对 回复 2022-05-19
?
哔哔one

TA贡献1854条经验 获得超8个赞

我使用您提供的文档正文创建了一个新索引“testind”并使用 Postman REST 客户端键入“testTyp”。:


POST http://localhost:9200/testind/testTyp

{

   "id":"514d4e9f-09e7-4f13-b6c9-a0aa9b4f37a0",

   "created":"2019-09-06 06:09:33.044433",

   "meta":{

      "userTags":[

         {

            "intensity":"1",

            "sentiment":"0.84",

            "keyword":"train"

         },

         {

            "intensity":"1",

            "sentiment":"-0.76",

            "keyword":"amtrak"

         }

      ]

   }

}

当我查询索引的映射时,这就是我得到的:


GET http://localhost:9200/testind/testTyp/_mapping

{  

  "testind":{  

    "mappings":{  

      "testTyp":{  

        "properties":{  

          "created":{  

            "type":"text",

            "fields":{  

             "keyword":{  

                "type":"keyword",

                "ignore_above":256

              }

            }

          },

          "id":{  

            "type":"text",

            "fields":{  

              "keyword":{  

                "type":"keyword",

                "ignore_above":256

              }

            }

          },

          "meta":{  

            "properties":{  

              "userTags":{  

                "properties":{  

                  "intensity":{  

                    "type":"text",

                    "fields":{  

                      "keyword":{  

                        "type":"keyword",

                        "ignore_above":256

                      }

                    }

                  },

                  "keyword":{  

                    "type":"text",

                    "fields":{  

                      "keyword":{  

                        "type":"keyword",

                        "ignore_above":256

                      }

                    }

                  },

                  "sentiment":{  

                    "type":"text",

                    "fields":{  

                      "keyword":{  

                        "type":"keyword",

                        "ignore_above":256

                      }

                    }

                  }

                }

              }

            }

          }

        }

      }

    }

  }

}

正如您在映射中看到的那样,字段是映射的一部分,将来可以根据需要进行查询,所以只要字段名称不是其中之一,我就不会在这里看到问题 - https://www .elastic.co/guide/en/elasticsearch/reference/6.4/sql-syntax-reserved.html(您可能希望避免使用“关键字”一词,因为稍后在编写搜索查询时可能会造成混淆,因为字段名和类型都是相同 - '关键字')。另外,请注意一件事,映射是通过动态映射创建的(https://www.elastic.co/guide/en/elasticsearch/reference/6.3/dynamic-field-mapping.html#dynamic-field-mapping) 在 Elasticsearch 中,因此数据类型由 elasticsearch 根据您提供的值确定。但是,这可能并不总是准确的,因此为了防止您可以使用 PUT _mapping API 为索引定义自己的映射,并且然后防止将类型中的新字段添加到映射中。


查看完整回答
反对 回复 2022-05-19
  • 2 回答
  • 0 关注
  • 207 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号