【问题标题】:Elasticsearch not analyzed and lowercaseElasticsearch 未分析和小写
【发布时间】:2017-01-12 21:34:56
【问题描述】:

我正在尝试将字段设为小写,而不是在 Elasticsearch 5+ 中进行分析,以便搜索带有小写空格的字符串(它们以混合大小写进行索引)
在 Elasticsearch v5 之前,我们可以使用这样的分析器来完成它:

  "settings":{
     "index":{
        "analysis":{
           "analyzer":{
              "analyzer_keyword":{
                 "tokenizer":"keyword",
                 "filter":"lowercase"
              }
           }
        }
     }
  }

但是,这对我现在不起作用。而且我认为问题在于“字符串”已被弃用并自动转换为关键字或文本。
这里的任何人都知道如何做到这一点?我考虑在我的映射中添加一个“字段”标签:

  "fields": {
    "lowercase": {
      "type": "string"
       **somehow convert to lowercase**
    }
  }

这会使使用它更具挑战性,我也不知道如何将其转换为小写。

您将在下面找到一个重现我的确切问题的测试设置。

创建索引:

{
  "settings":{
     "index":{
        "analysis":{
           "analyzer":{
              "analyzer_keyword":{
                 "tokenizer":"keyword",
                 "filter":"lowercase"
              }
           }
        }
     }
  },
  "mappings":{
     "test":{
        "properties":{
           "name":{
              "analyzer":"analyzer_keyword",
              "type":"string"
           }
        }
     }
  }
}

添加测试记录:

 {
    "name": "city test"
  }

应该匹配的查询:

{
    "size": 20,
    "from": 0,
    "query": {
        "bool": {
            "must": [{
                "bool": {
                    "should": [{
                        "wildcard": {
                            "name": "*city t*"
                        }
                    }]
                }
            }]
        }
    }
}

【问题讨论】:

  • 您为什么要搜索 name 字段,而映射中的字段名为 title?另外,为什么不简单地将其类型声明为 "type":"text" 呢?最后,amsterdam t 应该如何匹配 city test
  • 让我更新示例,我复制了错误的东西 :) 抱歉。如果我将其声明为文本,则它不适用于空格。
  • 我基本上想要的是有一个像“City Test”这样的字符串并在“city test”上匹配。就是这样。
  • 是的,但是如果您使用关键字/小写分析器将其声明为 text 会怎样?
  • 它完全忽略了这一点。它仍然不会匹配空格并且表现得好像我没有放置分析器一样。

标签: elasticsearch lowercase


【解决方案1】:

创建索引时,您需要确保analysis 部分位于settings 部分的正下方,而不是在settings > index 部分内,否则将无法正常工作。

那么您还需要为您的字段使用text 数据类型,而不是string。擦除你的索引,这样做,它会工作。

{
  "settings":{
        "analysis":{
           "analyzer":{
              "analyzer_keyword":{
                 "tokenizer":"keyword",
                 "filter":"lowercase"
              }
           }
        }
  },
  "mappings":{
     "test":{
        "properties":{
           "name":{
              "analyzer": "analyzer_keyword",
              "type": "text"
           }
        }
     }
  }
}

【讨论】:

  • 这在 ES 1.7.1 中不起作用,我的意思是它不支持 type text
  • @sunkuet02 在 1.7.1 中你可以使用 "type": "string" 代替,它是等价的
  • 我已经这样做了,但我未能成功满足我的要求:stackoverflow.com/q/44648327/2315473
猜你喜欢
  • 2016-05-07
  • 1970-01-01
  • 2015-02-11
  • 1970-01-01
  • 1970-01-01
  • 2014-09-13
  • 2021-07-16
  • 1970-01-01
  • 2011-07-19
相关资源
最近更新 更多