elasticsearch - 查询多个单词时,通配符无法按预期工作
问题描述
如果我在“消息”字段中搜索包含例如“被调用”的文档,我会得到预期的结果,但是当我搜索“被调用”、“被调用*”或
"*was called*"
我什么也没得到,尽管我有很多文档,其消息字段包含以下内容“应用程序被 REST API 调用”。
这是我发送的查询的一部分:
"wildcard": {
"message": {
"wildcard": "was called",
"boost": 1.0
}
}
这是映射的一部分:
"mappings": {
"doc": {
"dynamic_templates": [
{
"message_field": {
"path_match": "message",
"match_mapping_type": "string",
"mapping": {
"norms": false,
"type": "text"
}
}
},
{
"string_fields": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"fields": {
"keyword": {
"ignore_above": 256,
"type": "keyword"
}
},
"norms": false,
"type": "text"
}
}
}
],
"properties": {
...
"message": {
"type": "text",
"norms": false
}
}
}
}
我搜索的索引是由 Logstash 自动创建的。
我在另一个领域也有类似的问题;我在该字段中有以下值:“NP-00121”。*00121 有效,但 *-00121 无效。
编辑:还有一个示例:我有一个“requestUri”字段,其中包含“/api/v1/log/rest”、“/api/v1/log/notification”等。当我发送以下通配符查询时,我什么也得不到“/ api/v1*”。
所以看起来在使用空格和破折号时会出现问题。谁能帮我解决这个问题?
解决方案
通配符在令牌中使用。您的消息字段被索引为文本,因此将被标记为单词。
基本上,对于“被调用”之类的查询,您不需要通配符。只需使用一个短语查询,如:
"query": {
"match_phrase" : {
"message" : "was called"
}
}
或者,如果您更喜欢查询字符串查询:
"query": {
"query_string" : {
"query" : "message:\"was called\""
}
}
通配符查询对于搜索部分术语很有用,例如:
"query": {
"wildcard" : { "message" : "call*" }
}
如果您想查找所有包含“call”、“calling”或“calling”的文档。
对于像 NP-00121 这样的值或 URI,如果不分析这些字段可能会更有用。因为这些被分成令牌('np'和'00121'),所以你看到的问题。您可以将这些字段索引为“关键字”类型而不是“文本”,以将整个字段索引为单个未分析的标记。
推荐阅读
- vb.net - 可以悬停并可以附加到 vb.net 中的表单的用户控件
- java - 未能建立 SSL 通信 b/w 客户端进程和 MQ 系列
- python - 为什么以下 python 脚本没有按预期复制文件?
- c# - 第三个子级的Linq查询
- python - 如何以编程方式修改 Windows 上的 iTunes 播放列表?
- nutch - Nutch Fetch 失败,协议状态为:moved(12),lastModified=0:https://moorecompletedental.com/
- weblogic12c - wlst 离线将用户添加到现有域
- spring-boot - 当对象的默认生命周期为单例时,SpringBoot 中的并发如何工作
- android - 没有写入文件的权限:///storage/9016-4EF8:用户 10390 和当前进程都没有 android.permission.WRITE_MEDIA_STORAGE
- javascript - 在调用 Angular 构造函数之前捕获查询字符串