用于Elasticsearch的Python客户端的正则表达式支持有问题

时间:2019-05-19 12:20:40

标签: python-3.x elasticsearch

elasticsearch的python客户端无法与regexp一起正常工作。在附带的查询示例中,使用单词“ platform”可以正常工作。一旦添加了另一个词(例如“ java platform”),它将返回0次匹配。大写字母的单词也一样。想知道python客户端是否正确支持regexp吗?可能是什么问题?

我在字符串前后尝试了。*,以检查编码是否有问题,但无济于事。我需要更复杂的regex表达式,但无法成功使这个琐碎的案例正常工作。

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,例如在第二个示例中,索引文档包含字符串。

1 个答案:

答案 0 :(得分:0)

问题源于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,然后是平台(它们必须相邻)。