使用copy_to
字段时,我在elasticseach中遇到分析器问题,并且想知道这是错误还是按设计工作。
这是一个愚蠢的例子。
索引设置如下:
POST test/
{
"mappings": {
"doc" : {
"properties" : {
"metadata" : {
"type" : "string",
"index" : "analyzed",
"analyzer" : "french"
},
"author" : {
"type" : "string",
"index" : "analyzed",
"analyzer" : "standard",
"copy_to" : "metadata"
}
}
}
}
}
...然后填充一个文档:
POST test/doc/
{
"author" : "clément"
}
在
metadata
字段上搜索时,我的行为令人发指。POST test/doc/_search?pretty
{ "query": { "match": { "metadata": "clément" } } }
回复:
{
"took" : 3,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.30685282,
"hits" : [ {
"_index" : "test",
"_type" : "doc",
"_id" : "AU9vHqM5AZspzs43q2ir",
"_score" : 0.30685282,
"_source":{"author": "clément"}
} ]
}
}
好,找到了。
POST test/_analyze?pretty&field=doc.metadata
clément
回复:
{
"tokens" : [ {
"token" : "clement",
"start_offset" : 0,
"end_offset" : 7,
"type" : "<ALPHANUM>",
"position" : 1
} ]
}
注意法国分析仪如何从
é
中删除重音。现在,如果我尝试:
POST test/doc/_search?pretty
{ "query": { "match": { "metadata": "clement" } } }
(请求中没有任何重音),我希望可以找到该文档,因为
metadata
字段的分析器将产生相同的结果,但是我什么也没找到:{
"took" : 2,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 0,
"max_score" : null,
"hits" : [ ]
}
}
因此,它表现为,就好像一样,它在索引和搜索时都使用了标准分析器(例如
doc.author
中的分析器),而不是法语,并且始终保持重音。这是我尝试解决问题的精简设置。在我的实际设置中,有更多具有不同类型的字段和复制到
metadata
的分析器,并且我得到了相反的行为:我可以找到“clement”而不是“clément”,就像在索引时间使用了法国分析器一样,但是标准分析器是在搜索时使用的(但分析API总是返回平凡的结果)。那么,我是不是出错了,或者这是Elasticsearch中的错误吗?
顺便说一句,elasticsearch版本是1.7.1和Lucene 4.10.4。
最佳答案
如果我没记错的话,法国分析仪似乎会返回另一个结果,那么您所期望的结果是:
curl -XGET 'localhost:9200/_analyze?analyzer=french&pretty' -d 'clément'
{
"tokens" : [ {
"token" : "clement",
"start_offset" : 0,
"end_offset" : 7,
"type" : "<ALPHANUM>",
"position" : 1
} ]
}
和
curl -XGET 'localhost:9200/_analyze?analyzer=french&pretty' -d 'clement'
{
"tokens" : [ {
"token" : "cle",
"start_offset" : 0,
"end_offset" : 7,
"type" : "<ALPHANUM>",
"position" : 1
} ]
}
因此,IMO没有
copy_to
功能的错误,但是您可能需要调整french
分析器以满足您的需求,而不是使用默认配置:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html#french-analyzercle
和clement
不相等。这就解释了为什么它与您的clement
查询不匹配。
关于elasticsearch - elasticsearch中copy_to和analys之间的奇怪交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32250332/