我正在尝试使用elasticsearch一次查找多个术语。
更具体地说,当用户输入像“地震2”这样的搜索词时,我希望elasticsearch匹配“quake 2”和“quake ii”。因此,如果游戏存储在具有罗马数字的系统中,则匹配结果。
我将使用PHP检测搜索词中何时存在整数,然后生成包含罗马数字的对应词,这应该是直截了当的,所以我没有寻求帮助。
当它归结为使用elasticsearch一次查找两个字符串时,我碰到了一堵砖墙。
这是我尝试过的一个例子:
$json = '{
"query" : {
"terms" : {
"title" : [ "quake", "crysis" ],
"minimum_should_match" : 1
}
}
}
}';
$searchParams['index'] = 'thegamesdb';
$searchParams['type'] = 'game';
$searchParams['body'] = $json;
$elasticResults = $client->search($searchParams);
以上表现符合预期,并返回包含地震和光环的结果列表,每个结果都有相当理智的海洋乐谱。
但是当我尝试使用上述查询同时搜索“地震2”和“地震ii”时,我绝对没有命中?事实上,我已经确定它似乎是在标题和数字之间包含了弹性搜索的空格。
$json = '{
"query" : {
"terms" : {
"title" : [ "quake 2", "quake ii" ],
"minimum_should_match" : 1
}
}
}
}';
如果“条款”查询中不允许使用空格,那么我应该如何执行此类搜索呢?
答案 0 :(得分:2)
您是否尝试过使用
"terms" : {
"title" : [ "quake", "2", "ii" ],
"minimum_should_match" : 2
}
或者这有点天真?
答案 1 :(得分:2)
将查询拆分为两个。使用bool查询应该条件匹配查询以获得适当的结果。 匹配查询有效,因为ES会再次分析和构建匹配查询。
{
"query": {
"bool": {
"must": [
{
"match": {
"title": "quake 2"
}
},
{
"match": {
"title": "quake ii"
}
}
]
}
}
}
我试过了..它有效.. 它有帮助..!