为什么 elasticsearch 会分析一个文档 2 次?

Why does elastic search analyze a document 2 times?

据我了解,当我索引文档时说:

PUT <index>/_doc/1
{
   "title":"black white fox cat"
}

Elastic search 通过标准分析器对此进行分析,并将标题转换为标记数组。

但是当我搜索这份文件时,让我们说

POST <index>/_search
{
  "query":
  {
    "match":
     {
       "title":"black"
     }
  }
}

用同一个分析器又分析了z,是不是很低效?

效率不高,这是提供搜索结果的必要步骤。 让我解释一下搜索和索引过程的工作原理。

  1. 索引根据数据类型对 text 进行标记,并配置分析器并将标记索引到倒排索引中。
  2. 再次根据查询类型对搜索词进行标记(在查询词族的情况下没有标记),并将生成的标记搜索到在索引时间(步骤 1)创建的倒排索引中。
  3. tokens匹配过程(将倒排索引中的索引时间token与查询时生成的token进行匹配),就是找到匹配的文档并提供搜索结果,通常这个tokens匹配是一个精确的字符串匹配过程,在某些情况下除外(前缀查询、通配符查询等)。 并且由于它是一个精确的字符串匹配,因此它的过程非常快速和优化。

有多种use-cases,比如当你使用关键字数据类型时,text不被分析,当你使用term level queries搜索时分析不会发生。

现在,重要的是不要在搜索时在索引时使用相同的分析器,否则它最终会生成不同的令牌,而这些令牌不会在前面描述的步骤 3 中产生匹配项。