简单查询与某一特定字段不匹配
Simple query not matching for one specific field
我正在将一些任意数据放入 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": []
}
}
}
没有命中,也没有错误。
如果我尝试不同的字段,它会 returns 结果。其中两个结果具有相同的 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
}
}
},
真的不知道这里可能有什么问题。
在 elastic search 6 中,为每个字符串字段生成两种类型的映射。
一个是文字,一个是关键字。
- 这里的 reqId 字段是 text 类型 - >默认分析器是 standard.So 将生成的实际令牌是 5t42q1aumd9ls1e8q。
- 您正在执行的查询是词条查询,它找到确切的词条但不分析搜索。
所以发生的事情是被索引的令牌是 5t42q1aumd9ls1e8q 并且您正在搜索 5T42Q1AUmd9LS1E8Q
可以有两种解法
- 您在字段 reqId 上使用匹配查询。这将分析搜索字符串并匹配准确的索引标记。
- 否则您搜索未分析的 reqId.keyword 字段。
我正在将一些任意数据放入 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": []
}
}
}
没有命中,也没有错误。
如果我尝试不同的字段,它会 returns 结果。其中两个结果具有相同的 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
}
}
},
真的不知道这里可能有什么问题。
在 elastic search 6 中,为每个字符串字段生成两种类型的映射。 一个是文字,一个是关键字。
- 这里的 reqId 字段是 text 类型 - >默认分析器是 standard.So 将生成的实际令牌是 5t42q1aumd9ls1e8q。
- 您正在执行的查询是词条查询,它找到确切的词条但不分析搜索。 所以发生的事情是被索引的令牌是 5t42q1aumd9ls1e8q 并且您正在搜索 5T42Q1AUmd9LS1E8Q
可以有两种解法
- 您在字段 reqId 上使用匹配查询。这将分析搜索字符串并匹配准确的索引标记。
- 否则您搜索未分析的 reqId.keyword 字段。