ElasticSearch:将“not_analyzed”字段设置为“store”的影响:“是”?

假设我有一个在映射中指定为not_analyzed的string字段。 如果我然后添加"store":"yes"的映射,ElasticSearch会复制存储? 我对not_analyzed字段的理解是,它们不是通过分析器运行的, 按原样编制索引,但是客户端能够匹配它。 所以,如果一个字段是不not_analyzedstore:yes ,这可能会导致ElasticSearch保留string的两个副本。

我的问题:

  • 如果一个string字段被存储为not_analyzedstore:yes ,会有重复存储的string?

我希望这是很清楚的。 谢谢!

您正在将索引字段和存储字段的概念混合在lucene中,这是elasticsearch构build在其上的库。

当一个字段位于倒排索引内时,会被索引,这是lucene用来提供其强大而快速的全文本searchfunction的数据结构。 如果你想在一个领域search,你必须索引它。 当你为一个字段build立索引时,你可以决定是否索引它,或者你想分析它,这意味着决定一个标记器应用到它,这将产生一个标记列表(单词)和一个令牌列表filter,可以修改生成的令牌(甚至添加或删除一些)。 索引字段的方式会影响您如何在其上进行search。 如果您对某个字段进行索引,但不对其进行分析,并且其文本由多个词组成,那么您将能够find该文档仅search包含空格的特定文本。

当您希望能够检索该字段时,会存储一个字段。 比方说,Lucene也提供了一些存储,这和倒排索引本身没有任何关系。 当你使用lucene进行search时,你会得到一个匹配的文档id列表。 然后,您可以从存储的字段中检索一些文本,这就是您实际上显示的search结果。 如果你不存储一个字段,你将永远无法从lucene中获得它(但是这对于elasticsearch是不正确的,但是我将在下面进行解释)。

你可以有你只想search的领域,而不会显示:索引和不存储(默认在lucene)。
你可以有你想要search的字段,也可以检索:索引和存储。
你可以有你不想search的字段,但你想要检索以显示它们。

因此这两个数据结构是不相关的。 如果您同时使用lucene索引和存储字段,则其内容将不会以相同的forms出现两次。 存储的字段按照原样存储,因为您将它们发送到lucene,而索引字段可能会被分析,并将成为倒排索引的一部分,这是另一回事。 存储的字段是为特定的文档(通过lucene文档ID)检索的,而索引字段用于search,在这样的结构中,字面上将作为每个词作为关键词的文本反转,连同文档列表包含它的id(发布列表)。

说到弹性search,事情变了一点。 当你没有configuration字段存储在你的映射(默认是store:no ),你可以检索它默认情况下。 发生这种情况是因为elasticsearch总是在lucene中将所有发送给它的源文档(除非您禁用此function)存储在一个名为_source的特殊lucene字段中。

当您使用elasticsearch进行search时,默认情况下会返回整个源字段,但您也可以要求特定的字段。 在这种情况下会发生什么是elasticsearch检查这些特定的字段是否存储在lucene中。 如果他们是从lucene检索的内容,否则_source存储的字段将从lucene中检索,parsing为json(拉parsing),这些特定的字段将被提取。 在第一种情况下,可能会快一点,但不一定。 如果你的源代码真的很大,而且你只需要加载一些字段,那么将它们configuration为在lucene中存储可能会使加载过程更快; 另一方面,如果你的_source不是那么大,并且你想要加载很多的字段,那么最好加载一个存储的字段( _source ),这将导致单个磁盘寻道,parsing等。在大多数在使用_source字段的情况_source工作得很好。

要回答你的问题:倒排索引和lucene存储是两个完全不同的东西。 如果您决定在映射中存储一个字段( store:yes ),则最终只会在lucene中拥有相同数据的两个副本,因为elasticsearch会在json _source保留相同的内容,但这与这个没有任何关系您正在索引或分析字段的事实。