在弹性搜索中匹配数组而不是循环遍历它

时间:2016-01-17 16:59:40

标签: javascript json elasticsearch

我有一系列需要在搜索中匹配的项目。目前,我遍历数组并搜索每个项目,如下所示:

var ownerList = ['owner1', 'owner2', 'owner3'];
var searchResults = [];

for (var i = 0; i < ownerList.length; i ++ {

    var query = {
        'query': {
            'bool': {
                'must_not': {
                    'match': {'deleted': 'true'}
                },
                'must': [
                    {'match': {'owner': ownerList[i]}},
                    {'match': {'privacy': 'Public'}}
                ]
             }
         }
    };

    function doSearch(query) {
      //do search here
      searchResults.push(result);
    }
}

如何将数组放入查询中,并在没有循环的情况下执行搜索?

我了解terms filter可能有效,但我无法成功实施。

ownerList数组中的项是包含数字,短划线和小写字母的随机字符串。

谢谢!

2 个答案:

答案 0 :(得分:1)

对于exact matches,您需要将所有者字段映射为not_analyzed,有关详细信息,请参阅Mapping部分。之后,您可以将数组直接传递给terms filter

var ownerList = ["605ec41f-f32a-4f6f-a882-1a6d5379f9ab","006e5c63-c021-4341-8d15-b7071f54b6bf"]

var query = {
  "query": {
    "bool": {
      "must_not": {
        "match": {
          "deleted": "true"
        }
      },
      "must": [
        {
          "terms": {
            "owner": ownerList
          }
        },
        {
          "match": {
            "privacy": "Public"
          }
        }
      ]
    }
  }
}

现在,如果您想匹配 abcd-1234 以匹配 ABCD-1234 ,则需要keyword tokenizerlowercase filter一起使用{{} 1}}字段

希望这有帮助

答案 1 :(得分:0)

您可以对不同的值(should部分)使用OR。 这样的事情:

var ownerCondition = [];
for (var i = 0; i < ownerList.length; i ++ {
    ownerCondition.push( "{'match': {'owner': " + ownerList[i] + "}}" );
};

var query = {
    'query': {
        'bool': {
            'must_not': {
                'match': {'deleted': 'true'}
            },
            'should': ownerCondition,
            'must': [
                {'match': {'privacy': 'Public'}}
            ]
         }
     }
};