Elasticsearch - 启用字段的全文搜索

4

在搜索我的已记录事件时,我遇到了瓶颈。我正在使用 elasticsearch 解决方案,filebeat 将日志消息加载到 elasticsearch 中,并使用 Kibana 前端。

目前,我将消息记录到一个名为 message 的字段中,将异常堆栈跟踪(如果存在)记录到 error.message 中。因此,记录的事件片段可能如下所示:

{
   "message": "Thrown exception: CustomException (Exception for testing purposes)"
   "error" : {
      "message" : "com.press.controller.CustomException: Exception for testing purposes\n at
 com.press.controller....<you get the idea at this point>"
       }
}

当然,还有其他字段(如时间戳等),但这些并不重要。重要的是:
当我搜索时,可以找到我记录的事件。当我搜索时,就无法得到事件了。我需要能够全文检索所有字段。
有没有办法告诉Elasticsearch在字段中启用全文搜索?为什么“message”字段默认启用全文搜索?我的同事都不知道在部署后的控制台上运行任何索引命令,并且我们的权限不允许我或其他团队成员对任何字段运行索引或分析命令。所以必须在配置文件中。
到目前为止,我还没找到解决方法。请指引我正确的方向。
编辑: 字段的配置如下:
我们使用修改过的ECS,并将两个消息声明为
level: core
type: text

fields.yml 文件中。

在 filebeat 中,配置片段如下:

filebeat.inputs:
- type: log
  enabled: true
  paths: .....
  ...
  ...
processors:
- rename:
  fields:
  - from: "msg" 
    to: "message"
  - from: "filepath"
    to: "log.file.name"
  - from: "ex"
    to: "error.message"
  ignore_missing: true
  fail_on_error: true
logging.level: debug
logging.to_files: true

出于安全要求,我无法披露完整的文件。而且,我需要手写所有代码段,所以拼写错误很可能是我的问题。

谢谢。


请分享您的映射。 - Assael Azran
2个回答

3
您遇到的问题是与您字段相关联的分析器有关,ES中默认使用标准分析器对文本字段进行分析,如果文本包含 . 例如: foo.bar 将只生成一个标记作为 foo.bar ,而如果您希望在 foo.bar 中同时匹配 foo 和 bar ,则需要生成两个标记,即 foo 和 bar 。
您需要的是一个自定义分析器,可以像上面示例中所述将标记创建为包含 . 的 error.message 文本。
PUT /my_index
{                                                                                     
  "settings": {                                                                                                                                    
    "analysis": {
      "analyzer": {                                                                                                                                
        "my_analyzer": {                                                                                                                           
          "tokenizer": "standard",
          "char_filter": ["replace_dots"]
        }
      },
      "char_filter": {
        "replace_dots": {
          "type": "mapping",
          "mappings": [
            ". => \\u0020"
          ]
        }
      }
    }
  }
}

POST /my_index/_analyze
{                                                                           
  "analyzer": "my_analyzer",                                            
  "text": "foo.bar"
}

上面的示例创建了2个令牌,分别为foobar。当您使用这些API创建和测试时,应该发生相同的情况。
如果您在使用过程中遇到任何问题,请告诉我。

这肯定会帮助我避免一些麻烦,所以谢谢。不幸的是,它并没有完全解决问题,因为我无法搜索以空格分隔的单词(如“testing”)。似乎我的字段在某个地方被转换为关键字,但我无法确定位置。在声明时,它们都是文本。 - erewien
@erewien,你能分享一下 https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-get-mapping.html API 的输出吗? - Amit
1
确实,我能看到它。关键字真的无处不在。我无法在这里格式化它,所以我会立即将其附加到问题中。 - erewien
@erewien,很高兴你能解决这个问题,我建议你更新映射并按照建议使用自定义分析器,但是更改现有字段的分析器会导致破坏性变化,因此需要重新索引。 - Amit
是的,我很久以前就点赞了,但由于某种原因,我没有接受答案。可能是误点了选中框或其他什么原因。现在我已经接受了它。谢谢你注意到了这个问题。 - erewien
@erewien,感谢您的快速回复,这激励我们更多地帮助社区。 - Amit

0

Elastic Search默认情况下会索引所有字段,因此在此处您没有定义映射,因此所有字段应默认索引。 另外,针对您的情况,我怀疑数据是否正确地进入了Elastic Search,因为日志似乎不是正确的JSON格式。 如果您在Kibana中看到适当的日志,请发送一个样本日志/截图。


我无法截屏(或从实际上复制),因为我可以访问互联网的机器与具有Kibana的机器是分开的,所以我不幸地无法打印任何东西,只能手写JSON,因此错误可能是我的错。Kibana使用预期的数据填充,并且我可以在表格和JSON视图中正常查看日志。但是只有“消息”字段似乎可以使用全文搜索。 - erewien
@AmitKhandelwal - “mapping” 是指“Level: core”、“type: text” 的东西吗?因为我似乎无法访问更多内容。我无法使用我的帐户访问索引管理。 - erewien
@AmitKhandelwal - 你能否发送一下 Elastic Search 已完成的当前映射吗?你可以使用以下命令从 Kibana 开发工具部分获取映射:GET index_name - Surabhi Singh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接