嵌套字段搜索弹性搜索结构化数据

时间:2015-10-08 16:53:43

标签: search elasticsearch highlighting

我有一个名为"数据" 的字段。 "数据" 字段会动态填充结构化数据。结构化数据我们没有任何先前的FIXED结构。数据字段包含字符串,日期,整数等类型的数据。

结构化数据的例子是

"data":
{
   {
    "fname":"ravinder",
    "lastname":"reddy",
    "join":"2009-11-15T14:12:12"
     "address""
      {
       "Hno": "253",
       "Street" : "james Street"
      } 
   }
}

如何在该数据字段中搜索特定文字?

我应该能够在数据字段中搜索任何文本并突出显示所选文本。

我在搜索中使用了类似数据。*的模式。但由于数据字段有许多类型的数据。我正在运行时解析异常,并且所有分片都无法返回任何内容。

我的查询如下所示:

{
  "multi_match": {
    "query": "james street",
    "fields": [
      "data",
      "data.*"
    ],
    "type": {"phrase_prefix"}
  },
  "highlight":
   {
    "fields":{"data","data.*"}
   }
}

如果我替换"数据","数据。*"我可以做到这一点。用" _all" 。但我无法突出显示字段。

非常感谢任何帮助。非常感谢你

1 个答案:

答案 0 :(得分:0)

只是一次尝试,也许它可以让你开始,你可以进一步尝试:

DELETE /test
PUT /test
{
  "mappings": {
    "test": {
      "dynamic_templates": [
        {
          "data_template": {
            "match": "data",
            "mapping": {
              "copy_to": "my_custom_all_field",
              "term_vector": "with_positions_offsets",
              "store": true
            }
          }
        },
        {
          "inner_fields_of_data_template": {
            "path_match": "data.*",
            "mapping": {
              "copy_to": "my_custom_all_field",
              "term_vector": "with_positions_offsets",
              "store": true
            }
          }
        }
      ],
      "properties": {
        "my_custom_all_field": {
          "type": "string",
          "term_vector": "with_positions_offsets",
          "store": true
        }
      }
    }
  }
}

POST /test/test/1
{
  "data": {
    "fname": "ravinder",
    "lastname": "reddy",
    "join": "2009-11-15T14:12:12",
    "address": {
      "Hno": "253",
      "Street": "james Street"
    }
  }
}

POST /test/test/2
{
  "data": {
    "fname": "ravinder",
    "lastname": "james",
    "address": {
      "Hno": "253",
      "Street": "whatever Street"
    },
    "age": 55
  }
}

POST /test/test/3
{
  "data": {
    "fname": "mui",
    "lastname": "reddy",
    "address": {
      "Hno": "253",
      "Street": "james Street"
    },
    "age": 253
  }
}

GET test/test/_search
{
  "query": {
    "multi_match": {
      "query": "james street",
      "fields": [
        "my_custom_all_field"
      ],
      "type": "phrase_prefix"
    }
  },
  "highlight": {
    "fields": {
      "data.*": {}
    }
  }
}

对于上面的例子,你会得到这种输出:

  "hits": [
     {
        "_index": "test",
        "_type": "test",
        "_id": "3",
        "_score": 0.53423846,
        "_source": {
           "data": {
              "fname": "mui",
              "lastname": "reddy",
              "address": {
                 "Hno": "253",
                 "Street": "james Street"
              },
              "age": 253
           }
        },
        "highlight": {
           "data.address.Street": [
              "<em>james Street</em>"
           ]
        }
     },
     {
        "_index": "test",
        "_type": "test",
        "_id": "1",
        "_score": 0.4451987,
        "_source": {
           "data": {
              "fname": "ravinder",
              "lastname": "reddy",
              "join": "2009-11-15T14:12:12",
              "address": {
                 "Hno": "253",
                 "Street": "james Street"
              }
           }
        },
        "highlight": {
           "data.address.Street": [
              "<em>james Street</em>"
           ]
        }
     }
  ]