Elasticsearch对Unicode字符使用错误的Case Folding

时间:2015-09-08 08:25:05

标签: unicode elasticsearch icu

在我的一个项目中,我试图使用Elasticsearch(1.7)来查询数据。但是,它会返回unicode字符的不同结果,具体取决于它们是否是大写字母。我尝试使用icu_analyzer来摆脱问题。

这是一个展示我的问题的小例子。我的索引是这样的,

$ curl -X PUT http://localhost:9200/tr-test -d '
{
  "mappings": {
    "names": {
      "properties": {
        "name": {
          "type": "string"
        }
      }
    }
  },
  "settings": {
    "index": {
      "number_of_shards": "5",
      "number_of_replicas": "1",
      "analysis": {
        "filter": {
          "nfkc_normalizer": {
            "type": "icu_normalizer",
            "name": "nfkc"
          }
        },
        "analyzer": {
          "my_lowercaser": {
            "tokenizer": "icu_tokenizer",
            "filter": [
              "nfkc_normalizer"
            ]
          }
        }
      }
    }
  }
}'

这是一个用于演示我的问题的测试数据。

$ curl -X POST http://10.22.20.140:9200/tr-test/_bulk -d '
{"index": {"_type":"names", "_index":"tr-test"}}
{"name":"BAHADIR"}'

这是一个类似的查询。如果我使用BAHADIR作为query_string查询,我可以轻松找到我的测试数据。

$ curl -X POST http://10.22.20.140:9200/tr-test/_search -d '
{
  "query": {
    "filtered": {
      "query": {
        "query_string": {
          "query": "BAHADIR"
        }
      }
    }
  }
}'

在土耳其语中,BAHADIR的小写版本为bahadır。在使用bahadır查询时,我期待相同的结果。但是Elasticsearch无法找到我的数据。我无法解决使用ICU进行分析的问题。如果我使用bahadir查询,它的效果非常好。

我已阅读Living in a Unicode WorldUnicode Case Folding。但无法解决我的问题。我仍然无法使弹性搜索使用正确的案例折叠。

更新

我也尝试像这样创建我的索引。

$ curl -X PUT http://localhost:9200/tr-test -d '
{
  "mappings": {
    "names": {
      "properties": {
        "name": {
          "type": "string",
          "analyzer" : "turkish"
        }
      }
    }
  },
  "settings": {
    "index": {
      "number_of_shards": "5",
      "number_of_replicas": "1"
    }
  }
}'

但我得到的结果相同。如果我使用BAHADIRbahadir进行搜索,则可以找到我的数据,但搜索bahadır哪个是BAHADIR的正确小写版本无法找到。

0 个答案:

没有答案