【问题标题】:How to write a simple regexp query using elasticsearch in python?如何在python中使用elasticsearch编写一个简单的正则表达式查询?
【发布时间】:2020-10-13 01:28:15
【问题描述】:

我正在尝试在 python 中使用 elasticsearch 编写一个简单的正则表达式查询,但它不起作用。谁能告诉我哪里出错了?

result = es.search(index="my-index", body={"query": {"regexp": {"Name": "Vi.*" }}})

索引文档是一个包含我的名字的名字列表(Vitthal Bhandari)。当上面的查询应该返回我的名字时,它总是产生空结果。该文档已正确编入索引,其他查询工作正常。例如,匹配查询给出了所需的结果。

result = es.search(index="my-index", body={"query": {"match": {"Name": "Vitthal" }}})

我正在编写的正则表达式查询有什么问题,它不会给出任何结果?有什么建议吗?

**编辑:** “名称”映射如下:

"Name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        },

【问题讨论】:

  • 添加示例文档和名称映射

标签: python elasticsearch elasticsearch-dsl elasticsearch-query


【解决方案1】:

根据您的映射

"Name" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }

你有default analyzer

为了让它发挥作用:

{"query": {"regexp": {"Name": "vi.*" }}}

使用小写。

Vi.* 不工作的原因:

regexp 是一个 term 查询。这不是full text search 查询。

与全文查询不同,字词级查询不分析搜索字词。相反,术语级别的查询匹配存储在字段中的确切术语。

因此,它期望索引中以Vi 开头的术语不正确,因为它被分析并存储为vi..

Reference

【讨论】:

  • 感谢您的解决方案。有效。当我们在它的时候,你能帮我做另一件事吗?我程序的下一步是从用户那里获取搜索字符串作为输入,即在上面的示例中,字符串“Vi”将在运行时作为用户的输入。假设字符串存储在变量 str 中。如何使用 str 制定查询?
  • 请在here回复我的评论
【解决方案2】:

使用

{
  "query": {
    "regexp": {
      "Name": "vi.*"
    }
  }
}

{
  "query": {
    "regexp": {
      "Name.keyword": "Vi.*"
    }
  }
}

【讨论】:

    猜你喜欢
    • 2020-12-02
    • 1970-01-01
    • 1970-01-01
    • 2011-02-28
    • 2014-10-08
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    • 2023-03-22
    相关资源
    最近更新 更多