使用数组的多字段搜索在elasticsearch中使用“AND”运算符

时间:2015-05-20 21:52:05

标签: elasticsearch

我希望以与查询其他字段相同的方式将多值字段的值查询为单独的“字段”。 我有一个像这样的数据结构:

{
  name: 'foo one',
  alternate_name: 'bar two',
  lay_name: 'baz three',
  tags: ['stuff like', 'this that']
}

我的查询如下:

{
  query:
    query: stuff
    type: 'best_fields',
    fields: ['name', 'alternate_name', 'lay_name', 'tags'],
    operator: 'and'
}

'type'和'operator'完全适用于单值字段,仅当值包含整个查询时才匹配。例如,查询'foo two'不会返回匹配项。

我希望标签字段的行为方式相同。现在,查询'那些'将会返回匹配的东西,因为没有字段或标记值包含单个值中的两个单词。有没有办法实现这个目标?

修改 Val的评估很明显。我已将我的映射更新为以下内容(使用elasticsearch-rails / elasticsearch-model):

mapping dynamic: false, include_in_all: true do
  ... other fields ...
  indexes :tags, type: 'nested' do
    indexes :tag, type: 'string', include_in_parent: true
  end
end

1 个答案:

答案 0 :(得分:1)

请显示您的地图类型,但我怀疑您的tags字段是一个简单的string字段,如下所示:

{
    "your_type" : {
        "properties" : {
            "tags" : {
                "type" : "string"
            }
        }
    }
}

在这种情况下,ES将会“变平”"索引时tags字段中所有标记位于引擎盖下:

tags: "stuff", "like", "this", "that"

即。这就是为什么你在查询时会得到结果"因为tags字段包含两个单词。

前进的方法是让tags成为nested object type,就像这样

{
    "your_type" : {
        "properties" : {
            "tags" : {
                "type" : "nested",
                "properties": {
                    "tag" : {"type": "string" }
                }
            }
        }
    }
}

您需要重新索引数据,但至少查询tags: "stuff that"将不再返回任何内容。您的代码令牌将保持在一起"如你所料。试一试。