【问题标题】:Elasticsearch: Not analyzing when searching on a particular fieldElasticsearch:在特定字段上搜索时不分析
【发布时间】:2014-01-07 01:25:27
【问题描述】:

我正在将一些数据索引到 elasticsearch,其中一位是 IP 地址(存储为字符串类型,而不是 ip 类型)。我正在为 IP 地址字段使用自定义分析器,其定义如下:

'ipv4_address_analyzer' => [
    'type' => 'custom',
    'tokenizer' => 'ipv4_path_tokenizer',
    'filter' => [],
],

ipv4_path_tokenizer定义如下:

'ipv4_path_tokenizer' => [
    'type' => 'path_hierarchy',
    'delimiter' => '.',
    'buffer_size' => 15,
],

当我在映射中的字段上使用 index_analyzer 属性时,它会被索引并使用以下查询正确搜索:

{
  "query": {
    "query_string": {
      "query": "95.129",
      "fields": [
        "external_ip",
        "domains",
        "_all"
      ],
      "use_dis_max": true
    }
  },
  "size": 1000
}

但是...搜索词仍由默认搜索分析器处理,这会产生一些误报匹配。

我知道我可以在 IP 字段上指定一个 search_analyzer 属性以使用不同的搜索分析器,但我真正想要的是在搜索此字段时保持搜索词不变,而不是通过分析器运行。

有没有办法在每个字段的基础上禁用搜索词分析?

【问题讨论】:

  • 你能举一个误报匹配的例子吗?我不明白您保持搜索字词不变是什么意思。也许多领域会有所帮助?还是将 IP 放入术语过滤器而不是查询字符串?
  • 谢谢@kielni。如果在“.”上分析和标记搜索词然后 12.34.56.78 被标记为(除其他外)12、34、56、78。因此,它与 IP 56.78.90.12 匹配,因为它被 path_hierarchy 标记为 56、56.78、56.78.90 和 56.78.90.12。本质上,我不想在搜索该字段时分析搜索词。

标签: elasticsearch


【解决方案1】:

在浏览手册时终于找到了答案。 keyword 标记器保留原始术语,除了将其截断为最大缓冲区大小。不需要过滤器。自定义分析器如下:

'leave_me_alone' => [
    'type' => 'custom',
    'tokenizer' => 'keyword',
    'filter' => [],
],

【讨论】:

    猜你喜欢
    • 2021-12-13
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 2018-08-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 2014-02-15
    相关资源
    最近更新 更多