【问题标题】:Elasticsearch only finding hits with ".keyword" appendedElasticsearch 只查找附加了“.keyword”的命中
【发布时间】:2017-09-06 07:01:45
【问题描述】:

Elasticsearch 只查找附加了“.keyword”的匹配项

我在查询一个充满流利日志条目的 elasticsearch 5 实例时遇到了麻烦,这些日志条目是我从运行版本 1.7 的旧 elasticsearch 实例导入的。通过 Kibana 查询最简单的事情经常超时,我完全不知道该去哪里调查潜在的性能问题。我正在查询的索引的弹性搜索映射示例如下所示:

=> {"@log_name"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}},
 "@timestamp"=>{"type"=>"date"},
 "@version"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}},
 "action"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}},
 "api"=>{"type"=>"boolean"},
 "controller"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}},
 "db"=>{"type"=>"float"},
 "duration"=>{"type"=>"float"},
 "error"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}},
 "filtered_params"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}},
 "user"=>
  {"properties"=>
    {"email"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}},
     "snowflake_id"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}},
     "snowflake_uid"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}},
     "type"=>{"type"=>"text", "fields"=>{"keyword"=>{"type"=>"keyword", "ignore_above"=>256}}}}},
  ...

有了这个,我可以使用curl 查询索引,返回找到的文档总数:

curl -s -XGET 'localhost:9200/logstash-2017.08.15/_search?pretty' -H 'Content-Type: application/json' -d'
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "user.email": "user@example.com" 
          }
        }
      ]
    }
  }
}
' | jq ".hits.total | length"

0

表示找到 0 个文档。 然而,如果我将 user.email 替换为 user.email.keyword,查询返回的 total 数字为 40。

我想我的主要问题是:我如何知道我的映射对于这些数据是否正确? (对于导入的数据,它们是在插入时插入数据时创建的,我假设以后会自动创建它们)

【问题讨论】:

    标签: elasticsearch elasticsearch-5


    【解决方案1】:

    user.email 字段的类型为 text。当索引到这种类型的字段时,分析器将源值拆分并转换为一个或多个术语。每个术语都存储在索引中,以允许搜索该术语。该映射没有为该字段指定分析器,因此使用了default analyzer。要显示默认分析器输出的术语,请调用

    curl -s -XGET http://localhost:9200/logstash-2017.08.15/_analyze -d'{"text": "user@example.com"}' | jq . 
    

    按照您的示例,在 user.email 字段中搜索术语 user 可能会找到结果。

    user.email.keyword 子字段是 keyword 类型。这种类型的字段只能通过它们的确切值进行搜索。也就是说,搜索查询中指定的值必须完全等于原始源值。

    【讨论】:

    • 哦,哇 - 这非常有用 - 我不知道 ES 会将文本字段拆分为只能通过其标记值进行搜索。但是,我仍然不明白为什么查询我的所有索引都这么慢——也就是说,curl -s -XGET 'localhost:9200/logstash-* 超时,而在 curl -s -XGET 'localhost:9200/logstash-2017.09* 中搜索却没有。我还没有具体的证据,但似乎聚合导入之前和之后的文档会影响性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 2011-02-19
    • 2018-08-28
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    相关资源
    最近更新 更多