【发布时间】:2015-09-08 08:25:04
【问题描述】:
在我的一个项目中,我正在尝试使用 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 World 和Unicode Case Folding。但无法解决我的问题。我仍然无法让 elasticsearch 使用正确的大小写折叠。
更新
我也尝试像这样创建我的索引。
$ 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"
}
}
}'
但我得到了相同的结果。如果我使用BAHADIR 或bahadir 搜索可以找到我的数据,但通过搜索bahadır 无法找到它,这是BAHADIR 的正确小写版本。
【问题讨论】:
标签: unicode elasticsearch icu