当前位置: 首页 > 知识库问答 >
问题:

展开父路径的对象字段的动态映射

金令秋
2023-03-14
{
    "name": "bob",
    "age": 22,
    "title": "Vice Intern",
    "tagline": "Ask not what your company can do for you, but..."
}

我有的另一个要求是管理员给字段的名称也应该是他们可以搜索的。所以,例如,如果他们想找到所有有话要说的Vice实习生,lucene的查询可能是:

+title:"Vice Intern" +tagline:"company"

所以我想我可以定义一个动态映射。由于我不知道字段的名称提前,这似乎是一个伟大的方法。但是,关键是想出一种方法来区分应该分析的字符串字段和不应该分析的字符串字段!

我想,嘿,我就把所有需要分析的字段放到一个嵌套对象中,像这样:

{
    "name": "bob",
    "age": 22,
    "title": "Vice Intern",
    "textfields": {
        "tagline": "Ask not what your company can do for you, but...",
        "somethingelse": "lorem ipsum",
    }
}    
{
    "mytype": {
        "dynamic_templates": {
            "nested_textfields": {
                "match": "textfields",
                "match_mapping_type": "string",
                "mapping": {
                    "index": "analyzed",
                    "analyzer": "default"
                }
            }
        }
    }
}
+title:"Vice Intern" +textfields.tagline:"company"

编辑:

我尝试了以下动态模板。我正在尝试使用index_name删除“textfields”。在索引里。但是,这个动态模板似乎并不匹配,因为在放入文档并查看映射后,我没有看到指定的分析器。

    {
        "mytype" : {
            "dynamic_templates":
            [
            {
                "textfields": {
                    "path_match": "textfields.*",
                    "match_mapping_type" : "string",
                    "mapping": {
                        "type": "string",
                        "index": "analyzed",
                        "analyzer": "default",
                        "index_name": "{name}",
                        "fields": {                 
                            "sort": {
                                "type": "string",
                                "index": "not_analyzed",
                                "index_name": "{name}_sort"
                            }
                        }
                    }
                }
            }
            ]
        }
    }

共有1个答案

陆栋
2023-03-14

我能够通过以下索引创建(带有映射)、文档和搜索查询来复制您所要求的结果。类型确实有一些变化,但它符合示例的目的。

索引设置

PUT http://localhost:9200/sandbox

{
 "settings": { 
   "index": {
     "number_of_shards": 1,
     "number_of_replicas": 0
   }
 },
 "mappings": {
   "mytype": {
     "dynamic_templates": [
        {
            "indexedfields": {
                "path_match": "indexedfields.*",
                "match_mapping_type" : "string",
                "mapping": {
                    "type": "string",
                    "index": "analyzed",
                    "analyzer": "default",
                    "index_name": "{name}",
                    "fields": {                 
                        "sort": {
                            "type": "string",
                            "index": "not_analyzed",
                            "index_name": "{name}_sort"
                        }
                    }
                }
            }
        },
        {
            "textfields": {
                "path_match": "textfields.*",
                "match_mapping_type" : "string",
                "mapping": {
                    "type": "string",
                    "index": "not_analyzed",
                    "index_name": "{name}"
                }
            }
        },
        {
            "strings": {
                "path_match": "*",
                "match_mapping_type" : "string",
                "mapping": {
                    "type": "string",
                    "index": "not_analyzed"
                }
            }

        }
     ]
   }
 }
}

文件

PUT http://localhost:9200/sandbox/mytype/1
{
   "indexedfields":{
      "hello":"Hello world",
      "message":"The great balls of the world are on fire"
   },
   "textfields":{
      "username":"User Name",
      "projectname":"Project Name"
   }
}
POST http://localhost:9200/sandbox/mytype/_search
{
  "query": {
    "query_string": {
      "query": "message:\"great balls\""
    }
  },
   "filter":{
      "query":{
         "query_string":{
            "query":"username:\"User Name\""
         }
      }
   },
   "from":0,
   "size":10,
   "sort":[

   ]
}
{
   "took":2,
   "timed_out":false,
   "_shards":{
      "total":1,
      "successful":1,
      "failed":0
   },
   "hits":{
      "total":1,
      "max_score":0.19178301,
      "hits":[
         {
            "_index":"sandbox",
            "_type":"mytype",
            "_id":"1",
            "_score":0.19178301,
            "_source":{
               "indexedfields":{
                  "hello":"Hello world",
                  "message":"The great balls of the world are on fire"
               },
               "textfields":{
                  "username":"User Name",
                  "projectname":"Project Name"
               }
            }
         }
      ]
   }
}
 类似资料:
  • 问题内容: 我在以下架构中具有json对象: 在这里,该字段包含一个嵌入的json对象,并且该对象的模式是动态的,并且每次都不同。 的对象是不同的API服务,以及不同的API服务的不同方法获得的原始输出。不可能将其映射到所有可能的值。 是否可能有如下所示的java类: 或者类似的东西,以便我可以接收基本架构并对其进行处理,然后将其发送到相关类,该类将转换为适当的预期类? 问题答案: 使用 您可以从

  • 我有以下数据结构来我的服务器通过Http调用 然后我有下面的实体类 不管怎样,我都无法让spring boot匹配json属性文本(这两个值总是空的)。。。这可行吗 我需要生成的最终JSON如下 所以基本上我需要把我的孩子信息附加到父母身上。 更新我能够通过使用自定义JsonDeserializer获得与父级相同的一个属性,如下所示 这只适用于一个属性集,每个类使用@JsonDeserialize

  • 我有一个对象,我正试图映射到。现在这个有一个名为的枚举,其中包含一些值。我想使用将它们映射到中的其他枚举值。以下是我到目前为止的代码: 当我尝试编译它时,我得到了错误:

  • 我正在开发一个使用Go的网站,并将其连接到弹性搜索。在弹性搜索中,我可以为索引类型设置动态字段。当我从弹性搜索中读取文档时,它将返回一个JSON对象作为结果,该对象可以包括具有动态名称的字段(或用户定义的字段)。 我可以获取JSON结果并将其解组到Go结构中,但我不知道将这些动态字段作为Go结构的一部分的最佳方法是什么。 这就是我正在做的。例如,如果我从弹性搜索中获得一个联系人的文档,它可能看起来

  • 问题内容: 我正在使用Google GSON将Java对象转换为JSON。 目前,我具有以下结构: 当前,对象在对象内部。我想跳过对象并将对象移动到对象,如下所示: 如何使用GSON做到这一点? 编辑:我试图使用TypeAdapter来修改Step.class,但是在写入方法中,我无法将我的工时对象添加到JsonWriter中。 问题答案: 您可以通过编写代码,然后为注册一个自定义的序列化器,并确