如何使用elasticsearch一次搜索2个字符串?

时间:2014-03-19 15:55:35

标签: php elasticsearch full-text-search search-engine

我正在尝试使用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
                    }
                }
            }
        }';

如果“条款”查询中不允许使用空格,那么我应该如何执行此类搜索呢?

2 个答案:

答案 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"
               }
               }
            ]
        }
        }
    }

我试过了..它有效.. 它有帮助..!