elasticsearch - 在 ElasticSearch 中搜索“对象”字段的整个文本
问题描述
我有一个 ElasticSearch 索引,它有一个object
存储一些非常动态的 JSON 的属性。我想对该 JSON 字段进行全文搜索。如何索引此字段,以便我可以查看某个单词是否出现在 JSON 中的任何位置,而无需提前知道它将出现的确切键?比如,有没有办法只索引 JSON 属性的所有叶节点?顺便说一句,我在 ElasticSearch 6.8 上,所以我没有flattened
field,我认为它可以做到这一点。
索引定义
PUT /test?include_type_name=true
{
"settings": {"number_of_shards": 1, "number_of_replicas": 1},
"mappings": {
"_doc": {
"_source": {"enabled": "true"},
"properties": {
"content": {
"type": "object",
"enabled": "true"
}
}
}
}
}
文档插入
PUT /test/_doc/1
{
"content": {
"a": {
"b": {
"text": "42"
}
}
}
}
询问
GET /test/_search
{
"query": {
"match": {
"content": "42"
}
}
}
回复:
{
"took" : 1,
"timed_out" : false,
"_shards" : {
"total" : 1,
"successful" : 1,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 0,
"max_score" : null,
"hits" : [ ]
}
}
解决方案
你是对的,flattened
字段类型就是你需要的。但在升级之前,您可以使用动态模板来完成。在下面的映射中,我们匹配content
对象字段中的任何字符串字段,text
并将其值复制到另一个名为content_text
我们将能够搜索的字段中:
PUT /test
{
"mappings": {
"dynamic_templates": [
{
"full_name": {
"match_mapping_type": "string",
"path_match": "content.*",
"mapping": {
"type": "text",
"copy_to": "content_text"
}
}
}
],
"properties": {
"content_text": {
"type": "text"
},
"content": {
"type": "object",
"enabled": "true"
}
}
}
}
您的示例文件:
PUT /test/_doc/1
{
"content": {
"a": {
"b": {
"text": "42"
}
}
}
}
现在您可以在该新字段上进行搜索,就好像您在该字段内的任何字段上进行搜索一样content
:
GET /test/_search
{
"query": {
"match": {
"content_text": "42"
}
}
}
推荐阅读
- ios - 不正确地绘制圆弧会留下平坦的边缘
- ruby - 将邻接矩阵转换为邻接表以表示图
- vb.net - 如何使用 CSV Datasource-VB.net 以另一种形式将 DataGridView 行移动到另一个 DataGridView
- swiftui - 单击按钮时在表中创建新行 Swift UI
- python - 使用 Tkinter 创建自定义对话框
- python - 堆算法 - Python 中用于生成排列的非递归方法
- twilio - 播放文档中的示例导致“无效的内容类型”
- http - 中止 HTTP 请求而不关闭 Netty 中的连接
- c++ - printf("%.0f",x); C++ 中 round() 函数的替代方案!我的尝试正确吗?
- html - 如何在 html 代码中选择第一个表的最后一行?