带有嵌套对象的Elasticsearch查询

时间:2018-12-23 15:04:35

标签: elasticsearch nested

我有一个带有嵌套映射的索引。 我想执行一个查询,该查询将返回以下内容:给我所有文档,其中搜索词中每个单词出现在一个或多个嵌套文档中。

这里是索引:

properties: {
      column_values_index_as_objects: {
        type: "nested",
        properties: {
          value: {
            ignore_above: 256,
            type: 'keyword',
            fields: {
              word_middle: {
                analyzer: "searchkick_word_middle_index",
                type: "text"
              },
              analyzed: {
                term_vector: "with_positions_offsets",
                type: "text"
              }
            }
          }
        }
      }
    }

这是我尝试的最新查询:

nested: {
       path: "column_values_index_as_objects",
       query: {
          bool: {
             must: [
                {
                   match: {
                       "column_values_index_as_objects.value.analyzed": {
                       query: search_term,
                       boost: 10 * boost_factor,
                       operator: "or",
                       analyzer: "searchkick_search"
                      }
                   }
                }

例如,如果我搜索“食品和水”一词,我希望每个词至少出现在嵌套文档中。 即使只有一个单词,当前搜索也会返回文档

感谢您的帮助!

更新: 正如克里斯托弗(Cristoph)所建议的,该解决方案有效。现在我有以下问题。

这是我的索引:

  properties: {
      name: {
        type: "text"
      },
      column_values_index_as_objects: {
        type: "nested",
        properties: {
          value: {
            ignore_above: 256,
            type: 'keyword',
            fields: {
              word_middle: {
                analyzer: "searchkick_word_middle_index",
                type: "text"
              },
              analyzed: {
                term_vector: "with_positions_offsets",
                type: "text"
              }
            }
          }
        }
      }
    }

我要执行的查询是,如果我搜索“我的名字是男的”,​​它将给出所有单词都可以找到的所有文档-可能在嵌套文档中,也可能在名称字段中。 例如,我可以在名称字段中使用一个值为'guy'的文档,而在嵌套文档中使用其他单词

1 个答案:

答案 0 :(得分:0)

为此,我通常将术语分开并生成一个这样的请求(foo:bar是另一个字段上的另一个条件):

{
  "bool": {
    "must": [
      {
        "nested": {
          "path": "column_values_index_as_objects",
          "query": {
            "match": {
              "column_values_index_as_objects.value.analyzed": {
                "query": "food",
                "boost": "10 * boost_factor",
                "analyzer": "searchkick_search"
              }
            }
          }
        }
      },
      {
        "nested": {
          "path": "column_values_index_as_objects",
          "query": {
            "match": {
              "column_values_index_as_objects.value.analyzed": {
                "query": "and",
                "boost": "10 * boost_factor",
                "analyzer": "searchkick_search"
              }
            }
          }
        }
      },
      {
        "nested": {
          "path": "column_values_index_as_objects",
          "query": {
            "match": {
              "column_values_index_as_objects.value.analyzed": {
                "query": "water",
                "boost": "10 * boost_factor",
                "analyzer": "searchkick_search"
              }
            }
          }
        }
      },
      {
        "query": {
          "term": {
            "foo": "bar"
          }
        }
      }
    ]
  }
}