如何在elasticsearch中查询特殊字符

时间:2015-09-18 11:45:42

标签: elasticsearch

我在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":"\*"}}}}}

1 个答案:

答案 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的一个非常重要的概念:花时间阅读它,你将节省大量的时间来试图理解正在发生的事情。

要更一般地回答如何查询这些特殊字符,您必须控制分析,不要删除它们或在未分析的专用字段上查询。