当使用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总是返回微不足道的结果)。
那么,我是否出错了或者这是弹性搜索中的错误?
顺便说一句,弹性搜索版本是Lucene 4.10.4的1.7.1。
答案 0 :(得分:1)
如果我没弄错的话,法国分析仪似乎会返回另一个结果,那就是你期待的结果:
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
} ]
}
所以没有copy_to
功能的IMO错误,但您可能需要调整french
分析器以满足您的需求,而不是使用默认配置:https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-lang-analyzer.html#french-analyzer
cle
和clement
不相等。这就解释了为什么它与您的clement
查询不匹配。