簡體   English   中英

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

[英]How to index list of object in Elasticsearch?

我導入到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索引元素?

我使用了您提供的文檔主體來創建新索引'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 / zh-cn / elasticsearch / reference / 6.4 / sql-syntax-reserved.html (您可能希望避免使用術語“關鍵字”,因為稍后在編寫搜索查詢時可能會感到困惑,因為字段名和類型都相同-'關鍵字')。 此外,請注意一件事,該映射是通過Elasticsearch中的動態映射( https://www.elastic.co/guide/en/elasticsearch/reference/6.3/dynamic-field-mapping.html#dynamic-field-mapping )創建的因此,數據類型是由Elasticsearch根據您提供的值確定的。但是,這可能並不總是准確的,因此,為了防止您可以使用PUT _mapping API為索引定義自己的映射,然后防止使用新的類型中的字段不會添加到映射中。

您不需要特殊的映射即可為列表建立索引-每個字段都可以包含一個或多個相同類型的值。 請參閱數組數據類型

對於對象列表,可以將它們索引為objectnested數據類型。 默認情況下,elastic使用object數據類型。 在這種情況下,您可以查詢meta.userTags.keyword或/和meta.userTags.sentiment 結果將始終包含具有獨立匹配值的整個文檔,即。 搜索keyword=trainsentiment=-0.76您將找到id=514d4e9f-09e7-4f13-b6c9-a0aa9b4f37a0

如果這不是您想要的,則需要為字段userTags定義嵌套的數據類型映射,並使用嵌套的query

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM