如何使用elasticsearch搜索多个字段?

时间:2018-03-14 16:04:24

标签: node.js elasticsearch query-string

如何使用elasticsearch搜索多个字段?我尝试了很多查询,但没有一个问题。我希望搜索不区分大小写,并且一个字段比另一个字段更重要。我的查询如下:

const eQuery = {
    query: {
        query_string: {
            query: `*SOME_CONTENT_HERE*`,
            fields: ['title^3', 'description'],
            default_operator: 'OR',
        },
    },
}
esClient.search(
    {
        index: 'movies',
        body: eQuery,
    },
    function(error, response) {
    },
)

映射看起来像这样:

{
    mappings: {
        my_index_type: {
            dynamic_templates: [{ string: { mapping: { type: 'keyword' }, match_mapping_type: 'string' } }],
            properties: {
                created_at: { type: 'long' },
                description: { type: 'keyword' },
                title: { type: 'keyword' },
                url: { type: 'keyword' },
            },
        },
        _default_: {
            dynamic_templates: [{ string: { mapping: { type: 'keyword' }, match_mapping_type: 'string' } }],
        },
    },
}

1 个答案:

答案 0 :(得分:2)

问题是您的地图描述和标题的映射中的type: keyword。不分析关键字类型字段,即它们将索引数据存储为与发送到弹性数据完全相同。当您想要匹配唯一ID等内容时,它会被使用。阅读:https://www.elastic.co/guide/en/elasticsearch/reference/current/keyword.html

您应该阅读有关elasticsearch的分析器。您可以非常轻松地创建自定义分析器,这可以以不同方式更改您发送的数据,例如在索引或搜索之前降低所有内容。 幸运的是,有预先配置的分析仪,用于基本操作,如小写。如果您将描述和标题字段的类型更改为type: text,则您的查询将起作用。 阅读:https://www.elastic.co/guide/en/elasticsearch/reference/current/text.html

此外,我发现您为索引配置了动态模板。因此,如果未明确指定索引的映射,则所有字符串字段(如描述和标题)将被视为type:keyword。 如果您构建索引如下:

PUT index_name
{
  "mappings": {
    index_type: {
      "properties": {
        "description": {"type": "text"},
        "title": {"type": "text"}, ...
      }
    }
  }
}

你的问题应该解决了。这是因为默认情况下,标准分析器会对type:text字段进行分析,这会降低输入的范围。阅读:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-standard-analyzer.html