【问题标题】:Elasticsearch - Enable fulltext search of fieldElasticsearch - 启用字段的全文搜索
【发布时间】:2019-11-18 09:33:53
【问题描述】:

我在考虑搜索我记录的事件时遇到了障碍。我正在使用弹性搜索解决方案、filebeat 将消息从日志加载到弹性搜索,以及 Kibana 前端。

我目前将消息记录到字段message,并将异常堆栈跟踪(如果存在)记录到error.message。因此记录的事件的 sn-p 可能如下所示:

{
   "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>"
       }
}

当然还有其他字段,例如时间戳,但这些并不重要。重要的是:

当我搜索message : customException 时,我可以找到我记录的事件。当我搜索error.message : customException 时,我没有得到这些事件。我需要能够全文搜索所有字段。

有没有办法告诉 elasticsearch 在字段中启用全文搜索? 为什么“消息”字段默认启用它?我的同事都不知道部署后在控制台中的字段上运行了任何索引命令,并且我们的权限不允许我或其他团队成员在任​​何字段上运行索引或分析命令。所以它必须在某个地方的配置中。

到目前为止,我无法找到解决方案。请把我推向正确的方向。

编辑: 字段配置如下:

我们使用修改后的ECS,两条消息都声明为

level: core
type: text

在文件fields.yml 中。

在filebeat中,配置sn-p是这样的:

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

出于安全要求,我不能透露完整的文件。另外,我需要手写所有的 sn-ps,所以拼写错误可能是我的错。

谢谢

【问题讨论】:

  • 请分享您的映射。

标签: elasticsearch full-text-search kibana


【解决方案1】:

问题在于与您的字段关联的分析器,默认情况下,对于 ES 中的文本字段,使用标准分析器,如果文本包含 .,则不会创建单独的标记,例如:foo.bar 只会产生 1 个标记如foo.bar 而如果你希望foobar 都应该在foo.bar 中匹配,那么你需要生成2 个令牌作为foobar

您需要的是一个自定义分析器,它可以像上面一样创建令牌,因为您的 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”)。似乎我的字段在某处被转换为关键字,但我无法确定在哪里。在声明的时候,都是Text。
  • @erewien,可以分享一下elastic.co/guide/en/elasticsearch/reference/current/…api的o/p
  • 确实,我看得出来。到处都有关键字。我无法在此处对其进行格式化,因此我会及时将其附加到问题中。
  • @erewien,很高兴您能弄清楚,我建议您更新映射并按照建议使用自定义分析器,但是由于更改现有字段的分析器是一项重大更改,因此需要重新-索引。
  • @erewien ,您能否接受并支持我的回答,因为它解决了您的问题,这将有助于社区轻松找到答案,如果您有后续问题,请告诉我。
【解决方案2】:

Elastic Search 默认索引所有字段,这里您没有定义映射,因此默认情况下所有字段都应该被索引。 同样对于您的情况,我怀疑数据是否正确进入弹性搜索,因为日志似乎不是正确的 json。 如果是,您是否在 Kibana 中看到正确的日志,请发送示例日志/屏幕截图

【讨论】:

  • 我无法截屏(或复制,事实上),因为我可以访问互联网的机器和带有 Kibana 的机器是分开的,所以我无法打印任何东西,只能手动编写 JSON,所以错误可能是我的错。 Kibana 填充了预期的数据,我可以在表和 JSON 视图中看到正常的日志。但似乎只有 Message 字段可用于全文搜索
  • @AmitKhandelwal - 是“映射”“级别:核心”“类型:文本”的东西吗?因为我似乎无法访问更多。我无法使用我的帐户访问索引管理
  • @AmitKhandelwal - 您能否向您发送通过弹性搜索完成的当前映射。您可以使用以下命令从 kibana 开发工具部分获取映射:GET index_name
猜你喜欢
  • 2014-11-04
  • 2020-03-10
  • 1970-01-01
  • 2021-01-24
  • 2020-12-25
  • 2017-07-12
  • 2021-03-10
  • 1970-01-01
  • 2020-03-07
相关资源
最近更新 更多