【问题标题】:analyzed or not_analyzed, what to choose已分析或未分析,选择什么
【发布时间】:2017-09-08 10:45:40
【问题描述】:

我只使用 kibana 来搜索 ElasticSearch,而且我有几个字段只能取几个值(最坏的情况,服务器名称,30 个不同的值)。

我确实了解分析对更大、更复杂的字段 like this 的作用,但对于小而简单的字段,我无法理解分析/未分析字段的优势/劣势。

那么,对“有限的一组值”字段(例如 servername: server[0-9]* ,没有特殊字符可中断)使用 analyze 和 not_analyzed 有什么好处?我会在 kibana 中丢失什么样的搜索类型?我会获得任何搜索速度或磁盘空间吗?

在其中一个上进行测试时,我发现该字段的 .raw 版本现在为空,但 kibana 仍将该字段标记为已分析,因此我发现我的测试没有结果。

【问题讨论】:

    标签: elasticsearch logstash kibana elastic-stack


    【解决方案1】:

    我会尽量保持简单,如果您需要更多说明,请告诉我,我会详细说明更好的答案。

    “已分析”字段将使用您在映射中为该特定表定义的分析器创建一个标记。如果您使用默认分析器(当您引用没有特殊字符的内容时,可以说服务器 [1-9])使用默认分析器(alnum-lowercase word-braker(这不是它的基本名称))是去标记化:

    this -> HelloWorld123
    into -> token1:helloworld123
    
    OR
    
    this -> Hello World 123
    into -> token1:hello && token2:world && token3:123
    

    在这种情况下,如果您进行搜索:HeLlO,它将变为 ->“hello”,并且它将匹配此文档,因为存在标记“hello”。

    在 not_analized 字段的情况下,它根本不应用任何标记器,您的​​标记就是您的关键字,因此可以这么说:

    this -> Hello World 123
    into -> token1:(Hello World 123)
    

    如果您在该字段中搜索“hello world 123”

    不会匹配,因为它是“区分大小写”的(尽管 (Hello*),您仍然可以使用通配符,让我们在其他时间解决)。

    简而言之:

    对您要搜索的字段使用“已分析”字段,并且您希望 elasticsearch 对它们进行评分。例如:包含单词“jobs”的标题。查询:“标题:工作”。

    doc1 : title:developer jobs in montreal
    doc2 : title:java coder jobs in vancuver
    doc3 : title:unix designer jobs in toronto
    doc4 : title:database manager vacancies in montreal
    

    这将检索title1 title2 title3。

    在这种情况下,“分析”字段就是您想要的。

    如果您事先知道该字段上的数据类型,并且您将准确查询您想要的内容,那么“not_analyzed”就是您想要的。

    示例:

    从 server123 获取所有日志。

    查询:“服务器:server123”。

    doc1 :server:server123,log:randomstring,date:01-jan
    doc2 :server:server986,log:randomstring,date:01-jan
    doc3 :server:server777,log:randomstring,date:01-jan
    doc4 :server:server666,log:randomstring,date:01-jan
    doc5 :server:server123,log:randomstring,date:02-jan
    

    仅来自 server1 和 server5 的结果。

    我希望你明白这一点。正如我所说,保持简单就是你所需要的。

    analyzed -> 更多磁盘空间(如果分析字段很大,则更多)。分析-> 更多时间进行索引。分析 -> 更好地匹配文档。

    not_analyzed -> 磁盘空间减少。 not_analyzed -> 更少的索引时间。 not_analyzed -> 完全匹配字段或使用通配符。

    问候,

    丹尼尔

    【讨论】:

    • 感谢您的回复!我有几个问题: not_analyzed 真的区分大小写吗?我读到 kibana 搜索总是小写,所以有一个 servername: Server01 意味着它不能被搜索?以及正则表达式搜索怎么样?最后,对于 30 台服务器来说,甚至关心它是什么类型是否有意义?我认为速度和大小的变化会很小......
    • (Not_analozed) 区分大小写,但不代表该字段不可搜索,如果存储“Server01”则必须搜索“Server01”,“server01”不匹配文件。当您搜索已分析的字段时,ES 将对您的搜索关键字进行标记,但如果您正在搜索的字段是 not_analized,ES 不会将其小写。最后,它不取决于文档的数量,而是字段的大小,对于“服务器字段”,如果您根本不打算在该字段上使用特殊字符,您可以使用分析就好了 ;)跨度>
    • 想象一下,我们需要在“标题”中进行一些聚合和搜索……对于聚合,我们不需要分析,但对于搜索引擎,我认为我们需要。 ..在这种情况下,我们如何定义我们的文档映射??
    • @famas23 您可以添加一个多字段级别的映射,它允许您在同一个字段中同时进行分析和未分析,假设您创建“标题”:{“类型”:“字符串” , "fields": { "title_raw": { "type": "string", "index" : "not_analyzed" } } } 然后您可以按以下方式访问它们:对于聚合,您将使用 title.title_raw,对于搜索,您将使用 title.title 请记住,前面的语法引用了旧版本的 elasticsearch。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    • 2016-05-07
    • 2013-02-07
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 2021-03-26
    相关资源
    最近更新 更多