【问题标题】:How to implement "lowercase" in an ElasticSearch query?如何在 ElasticSearch 查询中实现“小写”?
【发布时间】:2021-01-07 02:00:20
【问题描述】:

我正在尝试在 ElasticSearch 中实现小写功能。根据这里的 API 文档

https://www.elastic.co/guide/en/elasticsearch/reference/current/lowercase-processor.html

你用这个代码sn-p

{
  "lowercase": {
   "field": "foo"
  }
}

在查询中获取包含在必填字段中的小写值。

他们没有具体的例子,我在执行搜索查询时不断收到错误。

这是我尝试过的:

 POST /users/_search
 {
  "size" : 10,
  "_source" : {
   "includes" : [
    "userid",
    "username" 
   ]
  },
  "query" : {
      "query_string" : {
          "query" : "*John*",
           "lowercase": { "default_field" : "username.keyword"}
      }
   },
 "sort" : [
   {
     "_doc" : {
      "order" : "desc"
    }
  }
 ]
}

在上述查询中,我尝试查找用户名“john”(将“John”转换为小写)。

错误信息如下:

{
  "error" : {
   "root_cause" : [
    {
     "type" : "parsing_exception",
     "reason" : "[query_string] unknown token [START_OBJECT] after 
   [lowercase]",
     "line" : 18,
     "col" : 27
     }
   ],
  "type" : "parsing_exception",
  "reason" : "[query_string] unknown token [START_OBJECT] after 
[lowercase]",
  "line" : 18,
  "col" : 27
 },
  "status" : 400
 }

如果我替换,相同的查询有效(尽管它没有给我所需的结果)

 "lowercase": { "default_field" : "username.keyword"}

  "default_field" : "username.keyword"

关于如何修复此查询的任何建议?谢谢!

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    您引用的处理器是摄取管道的一部分——使您能够摄取数据之前对其进行转换。与查询数据无关。

    您可以像这样模拟ingest pipeline

    POST _ingest/pipeline/_simulate
    {
      "pipeline": {
        "processors": [
          {
            "lowercase": {
              "field": "username"
            }
          }
        ]
      },
      "docs": [
        {
          "_source": {
            "username": "John"
          }
        }
      ]
    }
    

    检查this answer 以查看正在运行的管道。


    当您将文本数据提取到 Elasticsearch 中时,会对其进行分析和标记化。默认分析器是standard analyzer,您可以在运行时看到它是如何标记单词“John”的:

    GET _analyze
    {
      "text": "John",
      "analyzer": "standard"
    }
    

    如您所见,它会自动将任何输入文本小写。这意味着当您将单个文档提取到名为 indexname 的新索引中时:

    POST indexname/_doc
    {
      "username": "John"
    }
    

    然后您可以直接搜索小写标记:

    GET indexname/_search
    {
      "query": {
        "query_string": {
          "default_field": "username",
          "query": "john*"
        }
      }
    }
    

    事实上,你甚至不需要最后的通配符*

    【讨论】:

    • 这对@Dennis 有帮助吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-04
    • 2021-09-17
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 2014-09-13
    相关资源
    最近更新 更多