分析还是not_analyzed,选什么

analyzed or not_analyzed, what to choose

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

我确实了解分析对更大、更复杂的字段有何作用 like this,但我无法理解 advance/disadvantage 和 anaylyzed/not_analyzed 字段中的小而简单的字段。

那么对 "limited set of values" 字段使用 analyzed 和 not_analyzed 有什么好处(例如服务器名称:server[0-9]*,没有特殊字符可以打断)?我会在 kibana 中丢失什么样的搜索类型?我会获得任何搜索速度或磁盘 space 吗?

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

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

"analyzed" 字段将使用您在映射中为特定 table 定义的分析器创建一个标记。如果您使用的是默认分析器(因为您指的是没有特殊字符的东西,可以说服务器[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"

不会匹配,因为是 "case sensitive"(不过您仍然可以使用通配符 (Hello*),让我们改天再解决)。

简而言之:

对您要搜索的字段使用 "analyzed" 字段,并且您希望 elasticsearch 对其进行评分。示例:包含单词 "jobs" 的标题。查询:"title: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。

在那种情况下,"analyzed" 字段就是您想要的。

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

示例:

从 server123 获取所有日志。

查询:"server: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

仅来自服务器 1 和服务器 5 的结果。

好吧,我希望你明白我的意思。正如我所说,保持简单就是您所需要的。

已分析 -> 更多 space 在磁盘上(如果分析字段很大,则更多)。分析->更多时间进行索引。已分析 -> 更适合匹配文档。

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

此致,

丹尼尔