使用正则表达式搜索包含空格的 Elasticsearch 数据:

7

我希望使用正则表达式在elasticsearch中进行包含空格的搜索。我已经将字段设置为未分析,它的映射就像下面这样:

"type1": {
   "properties": {
      "field1": {
         "type": "string",
         "index": "not_analyzed",
         "store": true
      }
   }
}

我输入了两个值进行测试,

"field1":"XXX YYY ZZZ"
"field1":"XXX ZZZ YYY"

我使用正则表达式查询 /XXX YYY/ 的案例
(我希望使用这个查询来找到记录1但不是记录2)

{
    "query": {
        "query_string": {
           "query": "/XXX YYY/"
        }
    }
}

但是它返回0个结果。

然而,如果我不使用正则表达式(即没有使用斜杠“/”),记录1和记录2都会被返回。

这是否意味着在Elasticsearch中,我不能使用涉及空格的正则表达式查询?


请阅读此链接 https://dev59.com/T18e5IYBdhLWcg3w2NRR#25316837 - Amen
3个回答

1

0

您可以继续使用您的查询字符串,但是您的正则表达式只是缺少一个非常小的部分,即结尾处的.*。如果您运行它,您将得到您期望的单个结果。

{
    "query": {
        "query_string": {
           "query": "/XXX YYY.*/"
        }
    }
}

这对我的用例不起作用。"/XXX YYY.*/"将匹配像XXX YYY blah blah blah这样的字符串。然而,"/XXX YYY .* something else/"不会匹配XXX YYY blah blah something else...目前还不知道原因... - Tabbernaut
@Tabbernaut,请随意创建一个新问题来解决您的具体问题。 - Val
1
找到了一种方法:"/XXX YYY.*/" AND "/.*something else/" 可以工作。我猜这只能用两个子句来完成。 - Tabbernaut
@Tabbernaut 不确定你的使用情况,请随意创建一个新问题。 - Val

-1

你可以使用正则表达式查询来实现这个功能。需要注意的是,查询性能可能会比较慢。下面的查询将搜索所有文档,其中field1的值包含“XXX YYY”。

POST <index_name>/type1/_search
{
   "query": {
      "regexp": {
         "field1": ".*XXX YYY.*"
      }
   }
}

12
我不认为它识别空格字符。我还尝试使用\s,但没用。 - AbtPst
@AbtPst 你为什么这么说?请注意,“field1”字段被标记为“not_analyzed”。这将导致Elasticsearch不会在空格周围进行分词。因此,我的查询将起作用。 - bittusarkar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接