在弹性搜索中逃避正斜杠

gri*_*rdo 9 elasticsearch

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

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

{
   "query" : { "query_string" : {"query" : "AC/1234/A01"} }
}
Run Code Online (Sandbox Code Playgroud)

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

  {
    "query" : { "query_string" : {"query" : "\"AC/1234/A01\""} }
  }
Run Code Online (Sandbox Code Playgroud)

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

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

我的谷歌搜索告诉我

{
  "query" : { "query_string" : {"query" : "AC\\/1234\\/A01"} }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Val*_*Val 12

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

{
  "query" : { 
     "query_string" : {
        "query" : "AC\\/1234\\/A01",
        "analyzer": "keyword"         <---- add this line
     } 
  }
}
Run Code Online (Sandbox Code Playgroud)

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

  • 这似乎不适用于最新的ES! (14认同)