elasticsearch,query-string,Node.js,elasticsearch,Query String" /> elasticsearch,query-string,Node.js,elasticsearch,Query String" />

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

Node.js 如何使用elasticsearch搜索多个字段?,node.js,elasticsearch,query-string,Node.js,elasticsearch,Query String,如何使用elasticsearch搜索多个字段?我试过很多问题,但都没有成功。我希望搜索不区分大小写,并且一个字段比另一个字段更重要。我的查询如下所示: const eQuery = { query: { query_string: { query: `*SOME_CONTENT_HERE*`, fields: ['title^3', 'description'], default_operator:

如何使用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' } }],
        },
    },
}
PUT index_name
{
  "mappings": {
    index_type: {
      "properties": {
        "description": {"type": "text"},
        "title": {"type": "text"}, ...
      }
    }
  }
}
映射如下所示:

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' } }],
        },
    },
}
PUT index_name
{
  "mappings": {
    index_type: {
      "properties": {
        "description": {"type": "text"},
        "title": {"type": "text"}, ...
      }
    }
  }
}

问题在于字段描述和标题映射中的
type:keyword
。关键字类型字段不进行分析,即它们存储的索引数据与发送给elastic的数据完全相同。当您想要匹配唯一ID等内容时,可以使用它。请阅读:

您应该阅读有关elasticsearch的分析器。您可以非常轻松地创建自定义分析器,这些分析器可以以不同的方式更改发送给它们的数据,例如在索引或搜索之前将所有内容小写。 幸运的是,有用于基本操作(如小写)的预配置分析器。如果将描述和标题字段的类型更改为
type:text
,则查询将正常工作。 阅读:

另外,我看到您已经为索引配置了动态模板。因此,如果不显式指定索引的映射,则所有字符串字段(如description和title)都将被视为type:keyword。 如果您这样构建索引:

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' } }],
        },
    },
}
PUT index_name
{
  "mappings": {
    index_type: {
      "properties": {
        "description": {"type": "text"},
        "title": {"type": "text"}, ...
      }
    }
  }
}

你的问题应该解决。这是因为type:文本字段在默认情况下由标准分析器进行分析,标准分析器将输入降为小写。阅读:

你还应该写下你得到的错误。我没有得到任何错误。只是一个空的响应-不幸的是。哦,在这种情况下,您应该发布映射和失败的确切查询。另外,如果您显示ES索引中的文档,这将是一件非常棒的事情,您希望返回该文档。我不知道如何使它不区分大小写索引的映射应该指出问题所在。如果您在这两个字段上都使用标准分析器,应该没问题,因为它将索引值和传入的查询都用小写字母表示。非常感谢你的帮助和精彩的解释-我学到了很多。我肯定会读到analyzersGlad的文章来帮你:)