我有一系列需要在搜索中匹配的项目。目前,我遍历数组并搜索每个项目,如下所示:
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数组中的项是包含数字,短划线和小写字母的随机字符串。
谢谢!
答案 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 tokenizer与lowercase 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'}}
]
}
}
};