我正在对弹性搜索(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"} }
}
应该这样做,但它没有任何区别,查询有效,但我仍然得到数千个结果。
有人能指出我正确的方向吗?
答案 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 . '"';
}