【问题标题】:Simple query not matching for one specific field一个特定字段不匹配的简单查询
【发布时间】:2018-01-28 01:32:48
【问题描述】:

我将一些任意数据放入 elasticsearch(日志)。写入正常,大多数查询都能正常工作,但我有一个永远不匹配的“reqId”字段。

$ curl localhost:9200/log_general/log/c9811a1a-6710-424a-b67d-d02d6ad75c89 | jq .
{
  "_index": "log_general",
  "_type": "log",
  "_id": "c9811a1a-6710-424a-b67d-d02d6ad75c89",
  "_version": 1,
  "found": true,
  "_source": {
    "body": {
      "body": {
        "media": [],
        "parentId": "5a695c7bda3c26391649e332",
        "text": "Super bulk comment 25"
      },
      "method": "post",
      "url": "/addComment",
      "xuserid": "5a695c30da3c26391649e17f"
    },
    "logType": "request_start",
    "reqId": "5T42Q1AUmd9LS1E8Q",
    "reqUrl": "/addComment"
  }
}

我可以尝试通过 reqId

搜索
curl -XPOST localhost:9200/_search -H 'content-type: application/json' --data-binary @sample-query

样本查询:

{
  "query": {
    "bool": {
      "must": [
      {
        "term": {
          "reqId": "5T42Q1AUmd9LS1E8Q"
        }
      }
      ],
      "filter": [],
      "should": []
    }
  }
}

没有命中,也没有错误。

如果我尝试不同的字段,它会返回结果。其中两个结果具有相同的 reqId。

{
  "query": {
    "bool": {
      "must": [
      {
        "term": {
          "logType": "request_start"
        }
      }
      ],
      "filter": [],
      "should": []
    }
  }
}

这是elasticsearch为这两个字段生成的映射

      "logType": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },
      "reqId": {
        "type": "text",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256
          }
        }
      },

真的不知道问题出在哪里。

【问题讨论】:

  • 我刚刚读到elasticsearch存储了一个原始副本和一个解析后的副本。这可能是您遇到的问题,请尝试在术语中添加另一个道具:“index”:“not_analyzed”
  • 它不喜欢那样。根据我的阅读,它不会尝试分析它是否被映射为关键字。
  • 经过更多测试,至少有两个字段没有被处理。我减少了被索引的东西的数量,这似乎没有帮助。然后我删除了索引并在使用reqId: { type: 'keyword' } 向其写入任何记录之前设置了一个映射,现在它可以工作了。仍然会喜欢关于问题可能是什么的任何想法。

标签: elasticsearch elasticsearch-5


【解决方案1】:

在弹性搜索 6 中,每个字符串字段都会生成两种类型的映射。 一个是文本,另一个是关键字。

  1. 这里的 reqId 字段是 text 类型 - >默认分析器是标准的。因此将生成的实际令牌将是 5t42q1aumd9ls1e8q。
  2. 您正在执行术语查询的查询会找到确切的术语并且不分析搜索。 所以发生的事情是被索引的令牌是 5t42q1aumd9ls1e8q 并且您正在搜索 5T42Q1AUmd9LS1E8Q

可以有两种解决方案

  1. 您在字段 reqId 上使用匹配查询。这将分析搜索字符串并匹配精确的索引标记。
  2. 否则您搜索未分析的 reqId.keyword 字段

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2016-06-04
    相关资源
    最近更新 更多