在弹性搜索中copy_to和analyze之间的奇怪交互

时间:2015-08-27 13:11:07

标签: elasticsearch

当使用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。

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

cleclement不相等。这就解释了为什么它与您的clement查询不匹配。