【问题标题】:How to get search results from each index如何从每个索引中获取搜索结果
【发布时间】:2016-07-12 03:31:42
【问题描述】:

我在 Node Js 中使用 Elastic Search 来查询多个索引,如何从每个索引中获取结果:

var esClient = new elasticsearch.Client({host: config.elasticsearch.host});

esClient.search({
    index: ["abc", "xyz"],
    type: ["abc", "xyz"],
    body: {
        query: {
            multi_match: {
                query: q,
                type: "cross_fields",
                analyzer: "ac_search_analyzer",
                operator: op,
                fields: ["a^4", "b^4", "c^2", "d", "e"]
            }
        }
    },
    _sourceInclude: ["a", "b", "c"],
    size: 10
}).then(function (resp) {
    //do something
}

现在我只从 abc 获得所有 10 个结果,而没有来自 xyz 的结果。我应该怎么做才能得到来自abc 的 5 个结果和来自xyz 的 5 个结果。

【问题讨论】:

    标签: node.js search elasticsearch


    【解决方案1】:

    您可以使用msearch 在一次往返中从每个索引中查询 5 个结果。

    例子:

    client.msearch({
            body: [
                { _index: "abc", type: "abc"},
                {
                    query : { 
                        multi_match: {
                            query: q,
                            type: "cross_fields",
                            analyzer: "ac_search_analyzer",
                            operator: op,
                            fields: ["a^4", "b^4", "c^2", "d", "e"]
                        }
                    }, 
                    size : 5,
                    _source : ["a", "b", "c"]
                },
                { _index: "xyz", type: "xyz"},
                {
                    query : { 
                        multi_match: {
                            query: q,
                            type: "cross_fields",
                            analyzer: "ac_search_analyzer",
                            operator: op,
                            fields: ["a^4", "b^4", "c^2", "d", "e"]
                        }
                    }, 
                    size : 5,
                    _source : ["a", "b", "c"]
                }
            ],
    }).then(function (resp) {
      console.log(resp);
    });
    

    更新示例 2

    msearch_query ={
                    query : { 
                        multi_match: {
                            query: q,
                            type: "cross_fields",
                            analyzer: "ac_search_analyzer",
                            operator: op,
                            fields: ["a^4", "b^4", "c^2", "d", "e"]
                        }
                    }, 
                    size : 5,
                    _source : ["a", "b", "c"]
                };
    client.msearch({
            body: [
                { _index: "test", type: "test"},
                msearch_query,
                { _index: "new", type: "new"},
                msearch_query
            ],
    }).then(function (resp) {
      console.log(resp);
    });
    

    【讨论】:

    • 所以我必须为每个索引编写一个搜索查询?对于多个索引,有什么更好的编程方式?
    • 我不确定您所说的“更好的程序化方式”是什么意思?如果每个索引的查询都不同,则无法绕过它,而必须为 index 构造一个查询。如果查询相同,您始终可以将其分配给变量并在构造 msearch 查询时重用它。不确定这是否是您的要求?查看更新的示例
    • @saurabh 这不能回答问题吗?
    猜你喜欢
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多