【问题标题】:How to index list of object in Elasticsearch?如何在 Elasticsearch 中索引对象列表?
【发布时间】:2020-01-09 00:26:38
【问题描述】:

我提取到 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 会将keywordintensitysentiment 视为以后可以查询的字段。但是,在 ElasticSearch 方面,我可以观察到这并没有发生(我使用 Kibana 搜索 UI)——相反,我看到字段“meta.userTags”的值是整个对象列表。

如何在列表中创建 ElasticSearch 索引元素?

【问题讨论】:

    标签: python elasticsearch


    【解决方案1】:

    我使用您提供的文档正文创建了一个新索引“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
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          }
        }
      }
    }
    

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

    【讨论】:

      【解决方案2】:

      您不需要特殊的映射来索引列表 - 每个字段都可以包含一个或多个相同类型的值。见array datatype

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

      如果这不是您想要的,您需要为字段userTags 定义nested 数据类型映射并使用nested query

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-07-04
        • 2017-10-06
        • 1970-01-01
        • 2018-08-01
        • 2014-02-01
        • 2012-11-25
        • 1970-01-01
        • 2018-05-24
        相关资源
        最近更新 更多