0

我是 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令牌上,返回文档。

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

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

2 回答 2

0

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

因此,为了在 title.custom 上获得匹配,需要搜索“email-id is someid@someprovider.com”,而不是其中的一部分。

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

于 2020-05-26T06:38:11.677 回答
0

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

分析器的作用基于

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

现在使用上述三点并解释 API,您可以弄清楚您的情况发生了什么。

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

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

于 2020-05-26T06:15:19.023 回答