Link Search Menu Expand Document Documentation Menu

搜索分析器

搜索分析器在查询时指定,用于在对文本字段运行全文查询时分析查询字符串。

确定要使用的搜索分析器

为了确定在查询时对查询字符串使用哪个分析器,OpenSearch 按顺序检查以下参数

  1. 查询的 analyzer 参数
  2. 字段的 search_analyzer 映射参数
  3. 索引设置 analysis.analyzer.default_search
  4. 字段的 analyzer 映射参数
  5. standard 分析器(默认)

在大多数情况下,指定与索引分析器不同的搜索分析器没有必要,并且可能对搜索结果相关性产生负面影响,或者导致意外的搜索结果。

在查询时指定搜索分析器

您可以通过在查询中显式设置分析器来覆盖默认的分析器行为。以下查询使用 english 分析器对输入词元进行词干提取

GET /shakespeare/_search
{
  "query": {
    "match": {
      "text_entry": {
        "query": "speak the truth",
        "analyzer": "english"
      }
    }
  }
}

在映射中指定搜索分析器

定义映射时,您可以为任何text字段同时提供 analyzer(在索引时使用)和 search_analyzer(在查询时使用)。

以下配置允许在索引和查询时使用不同的分词策略

PUT /testindex
{
  "mappings": {
    "properties": {
      "text_entry": {
        "type": "text",
        "analyzer": "simple",
        "search_analyzer": "whitespace"
      }
    }
  }
}

以下配置启用了类似自动完成的行为,您可以键入单词的开头部分并仍然收到相关的匹配项

PUT /articles
{
  "settings": {
    "analysis": {
      "analyzer": {
        "edge_ngram_analyzer": {
          "tokenizer": "edge_ngram_tokenizer",
          "filter": ["lowercase"]
        }
      },
      "tokenizer": {
        "edge_ngram_tokenizer": {
          "type": "edge_ngram",
          "min_gram": 2,
          "max_gram": 10,
          "token_chars": ["letter", "digit"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "edge_ngram_analyzer",
        "search_analyzer": "standard"
      }
    }
  }
}

edge_ngram_analyzer 在索引时应用,将输入字符串分解为部分前缀(n-grams),这使得索引能够存储“se”、“sea”、“sear”等片段。使用以下请求索引文档

PUT /articles/_doc/1
{
  "title": "Search Analyzer in Action"
}

使用以下请求在 title 字段中搜索部分单词 sear

POST /articles/_search
{
  "query": {
    "match": {
      "title": "sear"
    }
  }
}

响应表明,包含“sear”的查询与文档“Search Analyzer in Action”匹配,因为在索引时生成的 n-gram 词元包含该前缀。这反映了自动完成功能,其中键入前缀即可检索完整的匹配项

{
  ...
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "articles",
        "_id": "1",
        "_score": 0.2876821,
        "_source": {
          "title": "Search Analyzer in Action"
        }
      }
    ]
  }
}

为索引设置默认搜索分析器

指定 analysis.analyzer.default_search 以定义所有字段的搜索分析器,除非被覆盖

PUT /testindex
{
  "settings": {
    "analysis": {
      "analyzer": {
        "default": {
          "type": "simple"
        },
        "default_search": {
          "type": "whitespace"
        }
      }
    }
  }
}

此配置可确保多个字段之间行为一致,尤其是在使用自定义分析器时。

有关支持的分析器的更多信息,请参阅分析器