【问题标题】:ElasticSearch mapping doesn't workElasticSearch 映射不起作用
【发布时间】:2011-09-07 18:23:12
【问题描述】:

我正在尝试为各个字段使用不同的分析器设置 ElasticSearch 索引。但是,我似乎找不到设置特定字段分析器的方法;以下是我创建(测试)索引的方式:

curl -XPOST localhost:9200/twitter
curl -XPUT 'http://localhost:9200/twitter/tweet/_mapping' -d '
{
    "tweet" : {
        "properties" : {
            "message" : {
                "type" : "string",
                "search_analyzer" : "snowball", 
                "index_analyzer" : "snowball"
            }
        }
    }
}'

如果我正确阅读了文档,那么这应该会创建类型为“tweet”的索引“twitter”,并且应该通过雪球词干分析器分析“消息”字段的内容。 为了对此进行测试,我尝试了以下查询:

curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
    "message" : "Look, a fighting War-Unicorn!"
}'
curl -XGET localhost:9200/twitter/_search?q=fight

如果我没记错的话,这应该会返回一个命中,因为战斗是战斗的主干;问题是,事实并非如此,我的命中率为零。似乎 ElasticSearch 完全忽略了映射(即使 ElasticSearch 接受所有这些查询,因为我对它们中的每一个都返回“ok”。)

我已经尝试用雪球分析器替换默认分析器,然后它就可以工作了;问题是,我完全需要特定领域的分析器,所以这对我没有帮助。我也尝试了不同的分析器,比如将“index”设置为“no”,但无济于事。

我做错了什么?

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    要使用特定于字段的分析器,您需要在查询中指定该字段。否则,使用默认分析器。试试

    curl -XGET 'localhost:9200/twitter/_search?q=message:fight'
    

    curl -XGET 'localhost:9200/twitter/_search?df=message&q=looking'
    

    【讨论】:

    • 好的,这适用于搜索分析器.. 但是雪球 index_analyzer 不应该像直接通过分析 API 运行句子时那样将“战斗”减少为“战斗”吗?在这种情况下,无论使用何种搜索分析器,搜索“fight”都会返回命中,不是吗?而且,更重要的是,如果我还不知道要搜索哪个字段怎么办?我这里只有一个,好吧,但我最终需要几个,然后搜索它们。
    • 雪球分析器确实将“消息”字段中的“战斗”减少为“战斗”。但是,如果您未在搜索中指定字段,则您正在搜索特殊的“_all”字段,该字段将索引“消息”字段(以及所有其他字段,如果有的话)的内容,但使用默认分析器分析此内容.
    • 好的,我明白了 - 谢谢你的解释,@imotov!仍然......如果索引分析器将“战斗”减少为“战斗”,“战斗”不是 ES 保存和索引并检查搜索查询的令牌吗?因此,如果文本是使用雪球分析器索引的,那么使用标准分析器搜索“战斗”不会返回匹配项吗?
    • 当您的邮件被索引时,它被索引为一个包含几个字段的文档:{message:["look","fight","war","unicorn"], _all:["look","a","fighting","war","unicorn"],_type:"tweet",...}。如果未指定搜索字段,您的查询将被转换为 _all:fight。请注意,因为字段 _all 是使用默认分析器分析的,所以它包含标记 fight,这就是它没有出现在结果中的原因。换句话说,您的消息使用两个不同的分析器(默认和雪球)索引了两次,并且您正在搜索默认分析器分析的版本。
    • 并非如此。这个“JSON”是对实际索引内容的简化。但是你可以通过调用curl -XGET 'localhost:9200/twitter/_analyze?analyzer=default&pretty=true' -d 'Look, a fighting War-Unicorn!'curl -XGET 'localhost:9200/twitter/_analyze?analyzer=snowball&pretty=true' -d 'Look, a fighting War-Unicorn!' 来获得它的一部分
    【解决方案2】:

    我建议您使用 https://github.com/lmenezes/elasticsearch-kopf 可以测试所有分析器并从另一个索引复制 mapp 并监控您的索引... http://www.elasticsearch.org/guide/en/elasticsearch/client/community/current/health.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-01
      • 1970-01-01
      • 2017-06-16
      • 1970-01-01
      • 2017-10-12
      • 1970-01-01
      • 2013-04-26
      • 2014-07-19
      相关资源
      最近更新 更多