我在elasticsearch中有一段数据,如下所示:
{"_index": "my_index",
"_type": "my_type",
"_id": "test_id",
"_version": 1,
"_score": 1,
"_source": {
"d2": "*",
"d1": "test_data"
}}
所以我可以通过这个条款搜索这些数据:
{"query": {"filtered":{"filter":{"term":{"d1":"test"}}}}}
然而,因为该领域" d2"有一个特定的字符" *",我很困惑,如何通过d2搜索这些数据。以下两种方法都不正确。
{"query": {"filtered":{"filter":{"term":{"d2":"*"}}}}}
或
{"query": {"filtered":{"filter":{"term":{"d2":"\*"}}}}}
答案 0 :(得分:3)
您的问题是您的索引不包含任何内容!
如果您没有设置特定的映射,则使用的动态映射已设置类型为string
的字段,默认情况下已分析 {{ 1}}分析器。
如果您使用标准分析器检查分析standard
的结果,您会发现您没有任何令牌:
*
ElasticSearch回复:
GET _analyze?analyzer=standard&text=*
更改地图,将{
"tokens": []
}
字段编入索引为d2
,文档将与您的查询相符。
示例:
not_analyzed
你终于有了结果:
POST /special/
{
"mappings":{
"character":{
"properties":{
"d2":{
"type":"string",
"index":"not_analyzed"
}
}
}
}
}
POST /special/character/
{
"d2":"*"
}
POST /special/_search
{
"query": {
"term": {
"d2": "*"
}
}
}
分析是ElasticSearch的一个非常重要的概念:花时间阅读它,你将节省大量的时间来试图理解正在发生的事情。
要更一般地回答如何查询这些特殊字符,您必须控制分析,不要删除它们或在未分析的专用字段上查询。