首页 > 解决方案 > elasticsearch 的 Python 客户端在正则表达式支持方面存在问题

问题描述

elasticsearch 的 python 客户端无法按预期使用正则表达式。在附带的带有单个单词“平台”的查询示例中,它可以正常工作。一旦我添加另一个词,如“java 平台”,它就会返回 0 次点击。同样适用于带有大写字母的单词。想知道 python 客户端是否正确支持正则表达式?可能是什么问题?

我在字符串之前和之后尝试过 .* 来检查编码是否有问题,但无济于事。我需要更复杂的正则表达式,但我没有成功让这个微不足道的情况正常工作。

es = Elasticsearch([{'host': 'localhost', 'port': 9200}])
result = es.search(index="mydoc", body={"query": {"regexp" : {"Title" : "platform"}}})
result = es.search(index="mydoc", body={"query": {"regexp" : {"Title" : "java platform"}}})

没有错误。对于像第二个示例中索引文档包含字符串的简单情况,问题是 0 次命中。

标签: python-3.xelasticsearch

解决方案


问题源于 elasticsearch 中的两种搜索模式:对每个单词使用标记的全文搜索,以及对整个字段值进行索引的关键字搜索。因此,要使用正则表达式搜索单词,我应该使用关键字模式,如下所示:

result = es.search(index='mydoc', size =34,body=
{
  "query": {
    "bool": {
      "must": [
        { "match": { "Title":   "java platform"        }}
      ],
      "filter": [
        { "regexp":  { "Title.keyword": ".*[j,J]ava platform.*" }}
      ]
    }
  }
})

匹配只是为了加快搜索速度,因为正则表达式开头包含 .* 。匹配也将匹配平台 java 和中间任意数量的单词,而正则表达式匹配特定顺序,首先是 java,然后是平台(它们必须是相邻的)。


推荐阅读