我导入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索引元素?
答案 0 :(得分:0)
我使用了您提供的文档正文来创建新索引'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
}
}
}
}
}
}
}
}
}
}
}
}
正如您在映射中看到的那样,字段是映射的一部分,以后可以根据需要进行查询,因此,只要字段名不是其中之一,我就不会在这里看到问题-{{ 3}}(您可能要避免使用术语“关键字”,因为稍后在编写搜索查询时可能会造成混淆,因为字段名和类型都相同-“关键字”)。另外,请注意,映射是通过Elasticsearch中的动态映射(https://www.elastic.co/guide/en/elasticsearch/reference/6.4/sql-syntax-reserved.html)创建的,因此数据类型是由Elasticsearch根据您提供的值确定的。但是,这可能并不总是准确的,因此防止您可以使用PUT _mapping API为索引定义自己的映射,然后阻止将类型内的新字段添加到映射。
答案 1 :(得分:0)
您不需要特殊的映射即可为列表建立索引-每个字段都可以包含一个或多个相同类型的值。参见array datatype。
对于对象列表,可以将它们索引为object
或nested
数据类型。默认情况下,弹性使用object
数据类型。在这种情况下,您可以查询meta.userTags.keyword
或/和meta.userTags.sentiment
。结果将始终包含具有独立匹配值的整个文档,即。搜索keyword=train
和sentiment=-0.76
,您将找到带有id=514d4e9f-09e7-4f13-b6c9-a0aa9b4f37a0
的文档。
如果这不是您想要的,则需要为字段userTags
定义nested数据类型映射,并使用nested query。