以下内容基于 Elasticsearch 2.0.1 。

首先是 or filter 已经变成了 bool ,它是专门用来合并 queries ,支持 or、and、not 这类操作符的,大概相当于 ()(?).

当然还涉及到搜索结果评分等,但是这里不提这些。

现在遇到的情景大概就是想搜索多个空格分隔的关键字,任何一个 field 满足任一个关键字则匹配成功,返回所有匹配成功的结果和它们的 highlight 字段。

首先是对搜索内容做一点微不足道的处理:

const queries = 'some keywords'.trim().split(/\s+/).map((query) => query.lowerCase());
const queryString = queries.join(' OR ');

保持所有 query 包裹在 bool 中,把上面的两个变量用在 POST body 中,curl 同理:

{
"index": "index",
"from": 11,
"size": 20,
"_source": false,
"body": {
"query": {
"bool": {
"should": [
{
"terms": {
"tags": queries,
},
},
{
"query_string": {
"query": queryString,
"fields": ["name^5", "name.analyzed^5", "email", "phone", "content"],
"analyzer": "whitespace",
},
},
],
"minimum_should_match": 1,
}
},
"highlight": {
"fields": {
"content": { fragment_size: 18, number_of_fragments: 1 },
"name: {},
"name.analyzed": {},
"tags": {},
"email": {},
"phone": {}
}
}
}
}

note: minimum_should_match may not be available in some version of elasticsearch.