分析或未分析,选择什么

时间:2016-05-30 19:38:39

标签: elasticsearch logstash kibana elastic-stack

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

我确实理解分析对更大,更复杂的字段like this做了什么,但是小而简单的我无法理解anaylyzed / not_analyzed字段的先行/劣势。

那么对于一组有限的价值观使用已分析和未分析的好处是什么?字段(例如.servername:server [0-9] *,没有要打破的特殊字符)?我会在kibana中失去什么样的搜索类型?我会获得任何搜索速度或磁盘空间吗?

在其中一个测试中我看到该字段的.raw版本现在为空,但是kibana仍然按照分析标记该字段,因此我发现我的测试没有结果。

1 个答案:

答案 0 :(得分:20)

我会尽量保持简单,如果你需要更多的澄清,请告诉我,我会详细说明。

"分析" field将使用您为映射中的特定表定义的分析器创建令牌。如果您正在使用默认分析器(因为您指的是没有特殊字符的东西,比如服务器[1-9])使用默认分析器(alnum-lowercase word-braker(这不是它基本上就是它的名称))是要标记化:

this -> HelloWorld123
into -> token1:helloworld123

OR

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

在这种情况下,如果你进行搜索: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。

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

分析 - >磁盘空间更多(如果分析结果很大,则更多)。分析 - >更多时间进行索引。分析 - >更适合匹配文档。

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

此致

丹尼尔