在我的一个项目中,我试图使用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。但无法解决我的问题。我仍然无法使弹性搜索使用正确的案例折叠。
我也尝试像这样创建我的索引。
$ 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
的正确小写版本无法找到。