elasticsearch - elasticsearch中copy_to和analys之间的奇怪交互

标签 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总是返回平凡的结果)。

那么,我是不是出错了,或者这是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-analyzer
cleclement不相等。这就解释了为什么它与您的clement查询不匹配。

关于elasticsearch - elasticsearch中copy_to和analys之间的奇怪交互,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32250332/

相关文章:

python - 从 Kibana 获取 elasticsearch 查询

amazon-web-services - 使用 AWS 基础设施为静态网站实现数据搜索系统的建议

elasticsearch - Elasticsearch constant_score不支持multi_match

elasticsearch - 重命名和删除 Elasticsearch 索引

json - Kibana对NESTED对象的查询为什么返回估计价格?

elasticsearch - Elasticsearch将文档字段值从整数更新为字符串

elasticsearch - Elasticsearch query_string和术语组合不起作用

postgresql - 将数据从 postgres 索引到 solr/elasticsearch

elasticsearch - elasticsearch查询问题,范围查询格式错误,预期为END_OBJECT,但找到FIELD_NAME

elasticsearch - 按分数排序时在 Elasticsearch 中搜索后(分页)