我有以下索引文档:
{
"visitor": {
"id": <SOME STRING VALUE>
}
}
Run Code Online (Sandbox Code Playgroud)
该文档的映射是:
"visitor": {
"properties": {
"id": {
"type": "string"
}
}
}
Run Code Online (Sandbox Code Playgroud)
当我运行以下查询时,我得到结果:
{
"query": {
"filtered": {
"query": {
"match_all": {}
}
},
"filter": {
"term": { "visitor.id": "123" }
}
}
}
Run Code Online (Sandbox Code Playgroud)
但是,这不是:
{
"query": {
"filtered": {
"query": {
"match_all": {}
}
},
"filter": {
"term": { "visitor.id": "ABC" }
}
}
}
Run Code Online (Sandbox Code Playgroud)
我一直认为这与分析仪有关,而且一直在追逐它.我也一直在想我是否错误地使用点符号来获取嵌套的访客属性.
任何人都可以告诉我为什么我不能过滤ID为"ABC"的访客,但可以访问123
And*_*ret 49
您需要了解elasticsearch的分析器的工作原理.分析器执行标记化(将输入分成一堆标记,例如在空格上)和一组标记过滤器(过滤掉你不想要的标记,如停用词或修改标记,如小写标记过滤器,将所有内容转换为小写).
分析在两个非常特定的时间执行 - 在索引期间(当您将内容放入elasticsearch时),并且根据您的查询,在搜索期间(在您正在搜索的字符串上).
这就是说,默认分析仪是标准分析器它由一的标准标记生成器,标准令牌滤波器(清理从标准标记生成器的令牌),小写令牌过滤,并停止字令牌滤波器.
举一个例子,当你保存字符串"我爱文森特的馅饼!" 进入elasticsearch,你正在使用默认的标准分析器,你实际上存储的是"我","爱","文森特","s","馅饼".然后,当您尝试使用term查询(未分析)搜索"Vincent's"时,您将找不到任何内容,因为"Vincent's"不是其中一个令牌!但是,如果您使用match查询(已分析)搜索"Vincent's" ,您会发现"我爱文森特的馅饼!" 因为"vincent"和"s"都找到了匹配.
底线是:
match,搜索自然语言字符串时.您可以将字段设置为不使用具有以下映射的分析器,该映射应该适合您的需要:
"visitor": {
"properties": {
"id": {
"type": "string"
"index": "not_analyzed"
}
}
}
Run Code Online (Sandbox Code Playgroud)有关进一步阅读,请参见http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/analysis.html.
Hos*_*eon 25
除非您指定不要分析visitor.id字段,否则默认情况下会分析每个字段.
这意味着"ABC"将被索引为"abc"(小写).
您必须在LOWER CASE中使用术语查询或术语过滤器和字符串.
我希望下面的查询能够奏效.^^
{
"query": {
"filtered": {
"query": {
"match_all": {}
}
},
"filter": {
"term": { "visitor.id": "abc" }
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
26311 次 |
| 最近记录: |