我有人把JSON对象放到Elasticsearch中,我不知道任何字段。我想使用matchQuery搜索所有字段中的给定值。
我知道_all已被弃用,而copy_to不起作用,因为我事先并不知道哪些字段可用。有没有办法在不知道要事先搜索哪些字段的情况下完成此操作?
答案 0 :(得分:3)
是的,您可以使用自定义_all
字段(我称之为my_all
)和索引的动态模板来实现此目的。基本上,这个想法是为copy_to
字段设置my_all
的所有字段设置通用映射。我还为store: true
字段添加了my_all
,但仅为了向您展示它有效,实际上您不会需要它。
所以,让我们去创建索引:
PUT my_index
{
"mappings": {
"_doc": {
"dynamic_templates": [
{
"all_fields": {
"match": "*",
"mapping": {
"copy_to": "my_all"
}
}
}
],
"properties": {
"my_all": {
"type": "text",
"store": true
}
}
}
}
}
然后索引文档:
PUT my_index/_doc/1
{
"test": "the cat drinks milk",
"age": 10,
"alive": true,
"date": "2018-03-21T10:00:00.123Z",
"val": ["data", "data2", "data3"]
}
最后,我们可以使用my_all
字段进行搜索,并在文档的_source
之外显示其内容(因为我们存储其内容):
GET my_index/_search?q=my_all:cat&_source=true&stored_fields=my_all
结果如下所示:
{
"_index": "my_index",
"_type": "_doc",
"_id": "1",
"_score": 0.2876821,
"_source": {
"test": "the cat drinks milk",
"age": 10,
"alive": true,
"date": "2018-03-21T10:00:00.123Z",
"val": [
"data",
"data2",
"data3"
]
},
"fields": {
"my_all": [
"the cat drinks milk",
"10",
"true",
"2018-03-21T10:00:00.123Z",
"data",
"data2",
"data3"
]
}
}
因此,您可以创建索引的索引和映射,然后您就可以搜索发送给它的任何人。