Elasticsearch:使用分析器组合时搜索如何工作?



我是Elasticsearch(ES(的新手,弄乱了分析器。如文档所述,可以根据用例指定分析器"索引时间"和"搜索时间"。 我的文档有一个文本字段title,并且我定义了以下映射,引入了子字段custom

PUT index/_mapping
{
"properties": {
"title": {
"type": "text",
"fields": {
"custom": {
"type": "text",
"analyzer": "standard",
"search_analyzer":"keyword"
}
}
}
}
}

因此,如果我有文本:"email-id is someid@someprovider.com"standard-analyzer会在索引期间将文本分析为以下标记:[email, id, is, someid, someprovider.com].

但是,每当我尝试查询字段(查询词具有不同的变体(title.custom时,都不会命中。

这就是我认为在使用关键字查询时正在发生的事情:email

  1. 它由关键字分析器进行分析。
  2. 字段 title.custom 的值也由关键字分析器(对令牌的分析(进行分析,从而生成与前面提到的相同的标记集。
  3. 令牌上应发生完全匹配email返回文档。

显然情况并非如此,我的理解存在差距。

  • 我想知道搜索过程中到底发生了什么。
  • 在通用级别上,我想知道当指定搜索和索引分析器的组合时,分析和搜索是如何发生的。

search_analyzer设置为title.custom的"关键字",使整个字符串作为单个搜索关键字工作。

因此,为了在title.custom上获得匹配项,需要搜索"电子邮件ID someid@someprovider.com",而不是其中的一部分。

search_analyzer在搜索时应用,以覆盖在索引时应用的分析器的默认行为。

好问题,但为了简单起见,让我一一解释不同的用例:

分析仪的作用基于

查询
  1. 类型(分析匹配,而不分析术语查询(。
  2. 默认情况下,如果像匹配查询一样分析查询,则它会对索引时使用的字段上使用的搜索词使用相同的分析器。
  3. 如果通过在字段上指定search_analyzer来覆盖默认行为,则在查询时使用该分析器创建将与生成的令牌匹配的令牌取决于分析器(标准是默认分析器(。

现在使用上述三点和解释 API,您可以弄清楚您的案例中发生了什么。

如果您需要更多信息,请告诉我,并很乐意进一步解释。

匹配与术语查询差异和分析 API 以查看令牌也会有所帮助。

最新更新