【问题标题】:Query with values that have special characters使用具有特殊字符的值进行查询
【发布时间】:2014-10-27 17:52:29
【问题描述】:

我有一个具有以下结构的文档:

{
    "_index": "logstash-2014.10.08",
    "_type": "iis",
    "_id": "HRM7LWfBSPGo9PUS0Z1ynw",
    "_score": 1,
    "_source": {
        "@version": "1",
        "@timestamp": "2014-10-08T12:37:26.000Z",
        "type": "iis",
        "messageId": 
  "O5pUHWOuEnTT0xQxXfNW6L+O6EMIjTFO7e//t+S/99en4zzOnlhqjEKlw02ZZVRFlyVaawA=="
    }
}

这是我的映射:

      "messageId" : {
        "type" : "string",
        "norms" : {
          "enabled" : false
        },
        "fields" : {
          "raw" : {
            "type" : "string",
            "index" : "not_analyzed",
            "ignore_above" : 256
          }
        }
      }

我正在尝试执行查询,并且我想仅返回具有在查询中传递的 messageId 的确切值的文档。我尝试使用匹配和过滤器执行查询。

如果我使用术语,它会返回零个文档:

{
  "query": {
    "term" : {
        "messageId" : 
      "O5pUHWOuEnTT0xQxXfNW6L+O6EMIjTFO7e//t+S/99en4zzOnlhqjEKlw02ZZVRFlyVaawA=="
        }
    }
}   

当我使用 match 时,我可以取回我的文档,但如果我对 messageId 进行少许更改,它仍会返回我的文档,并且查询时的 messageId 与文档不同。

{
  "query": {
    "match" : {
        "messageId" : 
             "O5pUHWOuxXfNW6L+O6EMIjTFO7e//t+S/99en4zzOnlhqjEKlw02ZZVRFlyVaawA=="
        }
    }
}

任何人都知道我如何进行查询并检索具有确切值 messageId 的文档?

提前致谢。

【问题讨论】:

  • 您可以添加 cURL 命令来重新创建它吗?我认为您的映射不会在索引时应用。您可以尝试测试字段分析器以确保它被索引为一个标记。
  • 我已经使用 Logstash 对其进行了索引。如何使用字段分析器?
  • 我不熟悉 Logstash 的规范,您的索引是自动配置的吗?使用 cURL 命令测试字段分析器@elasticsearch.org/guide/en/elasticsearch/reference/current/…

标签: elasticsearch


【解决方案1】:

我不认为这是一个特殊字符问题,而是我认为这是一个已分析与未分析的索引问题。如果您使用常规的已分析字段,则需要以小写形式搜索所有内容以获得术语匹配。对于未分析的情况并非如此。

我使用您的样本进行了以下测试,并且能够得到您想要的结果。

PUT index1

PUT index1/type1/_mapping
{
  "type1": {
    "properties": {
      "raw" : {
            "type" : "string",
            "index" : "not_analyzed",
            "ignore_above" : 256
          }
    }
  }
}

POST index1/type1
{
  "raw": "O5pUHWOuEnTT0xQxXfNW6L+O6EMIjTFO7e//t+S/99en4zzOnlhqjEKlw02ZZVRFlyVaawA=="
}

GET index1/type1/_search
{
  "query": {
    "term": {
      "raw": {
        "value": "O5pUHWOuEnTT0xQxXfNW6L+O6EMIjTFO7e//t+S/99en4zzOnlhqjEKlw02ZZVRFlyVaawA=="
      }
    }
  }
}

我的猜测是您正在处理的领域中的数据已被分析。您可以通过使用 _mapping API 来检查这一点。在我的示例中是:

GET index1/type1/_mapping

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 2017-10-06
    • 1970-01-01
    相关资源
    最近更新 更多