我有以下索引文件:
{ "visitor": { "id": <SOME STRING VALUE> } }
该文档的映射为:
"visitor": { "properties": { "id": { "type": "string" } } }
当我运行以下查询时,我得到结果:
{ "query": { "filtered": { "query": { "match_all": {} } }, "filter": { "term": { "visitor.id": "123" } } } }
但是,这不是:
{ "query": { "filtered": { "query": { "match_all": {} } }, "filter": { "term": { "visitor.id": "ABC" } } } }
我一直认为这与分析仪有关,并且一直在追逐下去。我也一直想知道我是否错误地使用点表示法来访问嵌套的visitor属性。
谁能告诉我为什么我不能过滤ID为“ ABC”的访客,但可以过滤访客123
您需要了解elasticsearch的分析器如何工作。分析仪进行标记化(分割的输入成一束令牌,如空白的),和一组令牌滤波器(过滤掉令牌你不想,像停止词,或修改令牌,像小写令牌滤波器,其将所有内容都转换为小写)。
在两个非常特定的时间执行分析-在索引编制期间(将内容放入elasticsearch时),以及根据查询在搜索期间(针对要搜索的字符串)。
这就是说,默认分析仪是标准分析器它由一的标准标记生成器,标准令牌滤波器(从标准标记生成器清理的令牌),小写令牌过滤,并停止字令牌滤波器。
举一个例子,当您保存字符串“ I love Vincent’s pie!”时 进入elasticsearch,并使用默认的标准分析器,实际上是在存储“ i”,“ love”,“ vincent”,“ s”,“ pie”。然后,当您尝试使用term查询( 未分析 )搜索“ Vincent’s”时,您将找不到任何内容,因为“ Vincent’s”不是这些标记之一!但是,如果使用match查询(经过 分析 )搜索“ Vincent的派” ,则会发现“我爱Vincent的派!” 因为“ vincent”和“ s”都找到匹配项。
term
match
最重要的是:
"visitor": { "properties": { "id": { "type": "string" "index": "not_analyzed" } }
}
有关更多信息,请参见http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis.html。