Search-as-you-type字段类型

Search-as-you-type字段类型提供使用前缀和后缀补全的搜索即输入功能。

示例

映射一个Search-as-you-type字段将创建该字段的n-gram子字段,其中n的范围是[2, max_shingle_size]。此外,它还会创建一个索引前缀子字段。

创建一个带有搜索即输入字段的映射:

PUT books
{
  "mappings": {
    "properties": {
      "suggestions": {
        "type": "search_as_you_type"
      }
    }
  }
}

除了 suggestions 字段外,这还创建了 suggestions._2gram、suggestions._3gram 和 suggestions._index_prefix 字段。

使用搜索即输入字段索引文档:

PUT books/_doc/1
{
  "suggestions": "one two three four"
}

为了匹配任意顺序的术语,请使用bool_prefix或multi-match查询。这些查询将搜索术语按指定顺序出现的文档排名高于搜索术语顺序错误的文档。

GET books/_search
{
  "query": {
    "multi_match": {
      "query": "tw one",
      "type": "bool_prefix",
      "fields": [
        "suggestions",
        "suggestions._2gram",
        "suggestions._3gram"
      ]
    }
  }
}

响应包含匹配的文档:

{
  "took" : 13,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 1.0,
    "hits" : [
      {
        "_index" : "books",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 1.0,
        "_source" : {
          "suggestions" : "one two three four"
        }
      }
    ]
  }
}

按顺序匹配术语,请使用match_phrase_prefix查询:

GET books/_search
{
  "query": {
    "match_phrase_prefix": {
      "suggestions": "two th"
    }
  }
}

响应包含匹配的文档:

{
  "took" : 23,
  "timed_out" : false,
  "_shards" : {
    "total" : 1,
    "successful" : 1,
    "skipped" : 0,
    "failed" : 0
  },
  "hits" : {
    "total" : {
      "value" : 1,
      "relation" : "eq"
    },
    "max_score" : 0.4793051,
    "hits" : [
      {
        "_index" : "books",
        "_type" : "_doc",
        "_id" : "1",
        "_score" : 0.4793051,
        "_source" : {
          "suggestions" : "one two three four"
        }
      }
    ]
  }
}

精确匹配最后术语,请使用match_phrase查询:

GET books/_search
{
  "query": {
    "match_phrase": {
      "suggestions": "four"
    }
  }
}

响应:

{
 "took" : 2,
 "timed_out" : false,
 "_shards" : {
   "total" : 1,
   "successful" : 1,
   "skipped" : 0,
   "failed" : 0
 },
 "hits" : {
   "total" : {
     "value" : 1,
     "relation" : "eq"
   },
   "max_score" : 0.2876821,
   "hits" : [
     {
       "_index" : "books",
       "_type" : "_doc",
       "_id" : "1",
       "_score" : 0.2876821,
       "_source" : {
         "suggestions" : "one two three four"
       }
     }
   ]
 }
}

参数

以下表格列出了search-as-you-type字段类型所接受的参数。所有参数都是可选的。

参数 描述
analyzer 要用于此字段的分析器。默认情况下,它将在索引时间和搜索时使用。要在搜索时间覆盖它,设置 search_analyzer 参数。默认是 standard 分析器,它使用基于语法的分词,并基于 Unicode 文本分割算法。配置根字段和子字段。
index 布尔值,指定字段是否可搜索。默认为true。配置根字段和子字段。
index_options 指定要存储在索引中以供搜索和突出显示的信息。有效值:docs(仅文档编号),freqs(文档编号和词频),positions(文档编号、词频和词位置),offsets(文档编号、词频、词位置以及起始和结束字符偏移量)。默认为positions。配置根字段和子字段。
max_shingle_size 一个指定最大n-gram大小的整数。有效值在[2, 4]范围内。要创建的n-gram在[2, max_shingle_size]范围内。默认值为3,创建一个2-gram和一个3-gram。更大的max_shingle_size值对于更具体的查询效果更好,但会导致索引大小更大。
norms 布尔值,指定在计算相关性得分时是否应使用字段长度。配置根字段和n-gram子字段(默认为false)。不配置前缀子字段(在前缀子字段中,norms是false)。
search_analyzer 搜索时使用的分析器。默认为analyzer参数中指定的分析器。配置根字段和子字段。
search_quote_analyzer 搜索时使用的分析器,与短语一起使用。默认为在analyzer参数中指定的分析器。配置根字段和子字段。
similarity 相关性评分的排名算法。默认为BM25。配置根字段和子字段。
store 布尔值,指定字段值是否应存储并可单独从 _source 字段检索。默认为 false。仅配置根字段。
term_vector 布尔值,指定是否应存储该字段的词向量。默认为no。配置根字段和n-gram子字段。不配置前缀子字段。