在弹性搜索中逃避正斜杠

时间:2015-08-12 11:17:01

标签: elasticsearch

我正在对弹性搜索(1.7)进行一般搜索,除了我的帐号中有正斜杠外,一切都很顺利。帐号字段不是id字段,并且是“not_analyzed”。

如果我搜索一个帐号,例如AC / 1234 / A01然后我得到了数千个结果,大概是因为它正在进行正则表达式搜索(?)。

{
   "query" : { "query_string" : {"query" : "AC/1234/A01"} }
}

我可以通过完全匹配搜索获得我想要的结果

  {
    "query" : { "query_string" : {"query" : "\"AC/1234/A01\""} }
  }

这实际上给了我想要的结果,可能会将该法案作为备用选项(围绕所有“单词”搜索引号)。但是我在想,如果他们进行多字搜索,包括帐号,我会回到成千上万的结果,虽然我看不到搜索的价值,但我想避免它发生。

基本上我有一个查询弹性搜索的java应用程序,我想要转义在GUI中输入的所有正斜杠。

我的谷歌搜索告诉我

{
  "query" : { "query_string" : {"query" : "AC\\/1234\\/A01"} }
}

应该这样做,但它没有任何区别,查询有效,但我仍然得到数千个结果。

有人能指出我正确的方向吗?

3 个答案:

答案 0 :(得分:11)

只需为查询字符串指定keyword analyzer,就可以获得所需内容而无需转义任何内容,如下所示:

{
  "query" : { 
     "query_string" : {
        "query" : "AC\\/1234\\/A01",
        "analyzer": "keyword"         <---- add this line
     } 
  }
}

如果您不这样做,则使用标准分析器(并将您的查询字符串标记化),无论您的字段类型是什么,或者是否为not_analyzed

答案 1 :(得分:2)

使用此查询作为示例:

{
  "query": {
    "query_string": {
      "fields": [
        "account_number.keyword"
      ],
      "query": "AC\\/1234\\/A01",
      "analyzer": "keyword"
    }
  }
}

答案 2 :(得分:1)

我使用query_string是因为我想让我的用户可以使用OR和AND进行复杂的查询。使用斜杠时(例如,搜索URL时)使搜索中断无济于事。

我通过在搜索字符串中没有反引号的斜线添加引号来解决该问题:

if (strpos($query, '/') !== false && strpos($query, '"') === false) {
    $query = '"' . $query . '"';
}