3.3. 搜索¶
搜索索引允许您使用 Lucene 查询解析器语法 查询数据库。搜索索引使用文档中的一个或多个字段。您可以使用搜索索引运行查询,根据文档中包含的内容查找文档,或使用组、分面或地理搜索。
警告
除非有一个正常运行的、与集群连接的 Clouseau 实例,否则搜索无法正常工作。有关详细信息,请参阅 搜索插件安装。
要创建搜索索引,您需要在数据库的设计文档中添加一个 JavaScript 函数。索引在处理一个搜索请求后或服务器检测到文档更新后构建。 index
函数接受以下参数
字段名称 - 您在查询索引时要使用的字段名称。如果将此参数设置为
default
,则在查询语法中未指定字段时,将查询此字段。您要索引的数据,例如
doc.address.country
。(可选) 第三个参数包括以下字段:
boost
、facet
、index
和store
。这些字段将在后面详细介绍。
默认情况下,搜索索引响应返回 25 行。可以使用 limit
参数更改返回的行数。每个响应都包含一个 bookmark
字段。您可以在以后的查询中包含 bookmark
字段的值以查看响应。
定义搜索索引的示例设计文档
{
"_id": "_design/search_example",
"indexes": {
"animals": {
"index": "function(doc){ ... }"
}
}
}
搜索索引将从包含它的设计文档的 options.partitioned
字段继承分区类型。
3.3.1. 索引函数¶
尝试使用不存在的数据字段进行索引会导致失败。为了避免这个问题,请使用适当的 保护子句。
注意
您的索引函数在内存受限的环境中运行,其中文档本身构成该环境中使用的内存的一部分。您的代码的堆栈和文档必须适合此内存。换句话说,必须加载文档才能被索引。文档的大小限制为最大 64 MB。
注意
在搜索索引中,不要使用多个数据类型索引同一个字段名称。如果在同一个搜索索引函数中使用不同的数据类型索引同一个字段名称,您可能会在查询搜索索引时收到错误,提示字段“在没有位置数据的情况下被索引”。例如,不要在同一个搜索索引函数中包含这两行,因为它们将 myfield
字段索引为两种不同的数据类型:字符串 "this is a string"
和数字 123
。
index("myfield", "this is a string");
index("myfield", 123);
索引字段中包含的函数是一个 JavaScript 函数,它将针对数据库中的每个文档调用。该函数将文档作为参数,从中提取一些数据,然后调用 index
字段中定义的函数来索引该数据。
index
函数接受三个参数,其中第三个参数是可选的。
第一个参数是您打算在查询索引时使用的字段名称,以及在后续查询的 Lucene 语法部分中指定的字段名称。以下查询中显示了一个示例
query=color:red
Lucene 字段名称
color
是index
函数的第一个参数。query
参数可以缩写为q
,因此另一种编写查询的方法如下q=color:red
如果在定义名称时使用特殊值
"default"
,则您不必在查询时指定字段名称。效果是查询可以简化query=red
第二个参数是要索引的数据。在索引数据时请牢记以下信息
此数据必须仅为字符串、数字或布尔值。其他类型会导致索引函数调用抛出错误。
如果由于此原因或其他原因在运行函数时抛出错误,则该文档将不会添加到该搜索索引中。
第三个可选参数是一个 JavaScript 对象,包含以下字段
索引函数(可选参数)
boost - 一个指定搜索结果中相关性的数字。使用大于 1 的 boost 值索引的内容比没有使用 boost 值索引的内容更相关。boost 值小于 1 的内容不太相关。值是一个正浮点数。默认值为 1(不增强)。
facet - 创建一个分面索引。请参阅 分面。值是
true
或false
。默认值为false
。index - 数据是否被索引,以及如何索引。如果设置为
false
,则数据不能用于搜索,但如果store
设置为true
,则仍然可以从索引中检索数据。请参阅 分析器。值是true
或false
。默认值为true
store - 如果为
true
,则该值将在搜索结果中返回;否则,该值将不会返回。值是true
或false
。默认值为false
。
注意
如果您没有设置
store
参数,则文档的索引数据结果不会在查询响应中返回。
示例搜索索引函数
function(doc) {
index("default", doc._id);
if (doc.min_length) {
index("min_length", doc.min_length, {"store": true});
}
if (doc.diet) {
index("diet", doc.diet, {"store": true});
}
if (doc.latin_name) {
index("latin_name", doc.latin_name, {"store": true});
}
if (doc.class) {
index("class", doc.class, {"store": true});
}
}
3.3.1.1. 索引保护子句¶
index
函数需要要索引的数据字段的名称作为第二个参数。但是,如果该数据字段对于该文档不存在,则会发生错误。解决方案是使用适当的“保护子句”来检查字段是否存在,并包含预期类型的数据,在尝试创建相应的索引之前。
未检查索引数据字段是否存在时的示例
if (doc.min_length) {
index("min_length", doc.min_length, {"store": true});
}
您可以使用 JavaScript typeof
函数来实现保护子句测试。如果字段存在并且具有预期类型,则会返回正确的类型名称,因此保护子句测试成功,并且可以使用索引函数。如果字段不存在,您将不会获得预期的字段类型,因此您不会尝试索引该字段。
JavaScript 认为如果测试以下值之一,则结果为 false
‘undefined’
null
数字 +0
数字 -0
NaN(非数字)
“” (空字符串)
使用保护子句来检查所需的字段是否存在,并包含一个数字,在尝试索引之前
if (typeof(doc.min_length) === 'number') {
index("min_length", doc.min_length, {"store": true});
}
使用通用保护子句测试来确保候选数据字段的类型已定义。
通用保护子句示例
if (typeof(doc.min_length) !== 'undefined') {
// The field exists, and does have a type, so we can proceed to index using it.
...
}
3.3.2. 分析器¶
分析器是定义如何在文本中识别词语的设置。如果您需要 索引多种语言,分析器可能会有所帮助。
以下是搜索支持的通用分析器列表及其描述
classic
- 标准 Lucene 分析器,大约在 3.1 版发布。email
- 与standard
分析器类似,但更努力地将电子邮件地址匹配为完整的标记。keyword
- 输入不会被标记。simple
- 在非字母处分割文本。standard
- 默认分析器。它实现了来自 Unicode 文本分段算法 的词语断词规则。whitespace
- 在空白边界处分割文本。
示例分析器文档
{
"_id": "_design/analyzer_example",
"indexes": {
"INDEX_NAME": {
"index": "function (doc) { ... }",
"analyzer": "$ANALYZER_NAME"
}
}
}
3.3.2.1. 特定语言分析器¶
这些分析器省略了特定语言中的常用词语,并且许多分析器还 删除前缀和后缀。语言名称也是分析器名称。有关更多信息,请参阅 包 org.apache.lucene.analysis。
语言 |
分析器 |
---|---|
|
org.apache.lucene.analysis.ar.ArabicAnalyzer |
|
org.apache.lucene.analysis.hy.ArmenianAnalyzer |
|
org.apache.lucene.analysis.eu.BasqueAnalyzer |
|
org.apache.lucene.analysis.bg.BulgarianAnalyzer |
|
org.apache.lucene.analysis.br.BrazilianAnalyzer |
|
org.apache.lucene.analysis.ca.CatalanAnalyzer |
|
org.apache.lucene.analysis.cjk.CJKAnalyzer |
|
org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer |
|
org.apache.lucene.analysis.cz.CzechAnalyzer |
|
org.apache.lucene.analysis.da.DanishAnalyzer |
|
org.apache.lucene.analysis.nl.DutchAnalyzer |
|
org.apache.lucene.analysis.en.EnglishAnalyzer |
|
org.apache.lucene.analysis.fi.FinnishAnalyzer |
|
org.apache.lucene.analysis.fr.FrenchAnalyzer |
|
org.apache.lucene.analysis.de.GermanAnalyzer |
|
org.apache.lucene.analysis.el.GreekAnalyzer |
|
org.apache.lucene.analysis.gl.GalicianAnalyzer |
|
org.apache.lucene.analysis.hi.HindiAnalyzer |
|
org.apache.lucene.analysis.hu.HungarianAnalyzer |
|
org.apache.lucene.analysis.id.IndonesianAnalyzer |
|
org.apache.lucene.analysis.ga.IrishAnalyzer |
|
org.apache.lucene.analysis.it.ItalianAnalyzer |
|
org.apache.lucene.analysis.ja.JapaneseAnalyzer |
|
org.apache.lucene.analysis.ja.JapaneseTokenizer |
|
org.apache.lucene.analysis.lv.LatvianAnalyzer |
|
org.apache.lucene.analysis.no.NorwegianAnalyzer |
|
org.apache.lucene.analysis.fa.PersianAnalyzer |
|
org.apache.lucene.analysis.pl.PolishAnalyzer |
|
org.apache.lucene.analysis.pt.PortugueseAnalyzer |
|
org.apache.lucene.analysis.ro.RomanianAnalyzer |
|
org.apache.lucene.analysis.ru.RussianAnalyzer |
|
org.apache.lucene.analysis.es.SpanishAnalyzer |
|
org.apache.lucene.analysis.sv.SwedishAnalyzer |
|
org.apache.lucene.analysis.th.ThaiAnalyzer |
|
org.apache.lucene.analysis.tr.TurkishAnalyzer |
注意
The japanese
analyzer, org.apache.lucene.analysis.ja.JapaneseTokenizer, includes DEFAULT_MODE and defaultStopTags.
注意
特定语言分析器针对指定语言进行了优化。您不能将通用分析器与特定语言分析器组合使用。相反,您可以使用 每个字段分析器 为文档中的不同字段选择不同的分析器。
3.3.2.2. 每个字段分析器¶
The perfield
analyzer configures multiple analyzers for different fields.
为不同字段定义不同分析器的示例
{
"_id": "_design/analyzer_example",
"indexes": {
"INDEX_NAME": {
"analyzer": {
"name": "perfield",
"default": "english",
"fields": {
"spanish": "spanish",
"german": "german"
}
},
"index": "function (doc) { ... }"
}
}
}
3.3.2.3. 停用词¶
停用词是不会被索引的词语。您可以在设计文档中通过将分析器字符串转换为对象来定义它们。
注意
The keyword
, simple
, and whitespace
analyzers do not support stop words.
The default stop words for the standard
analyzer are included below
"a", "an", "and", "are", "as", "at", "be", "but", "by", "for", "if",
"in", "into", "is", "it", "no", "not", "of", "on", "or", "such",
"that", "the", "their", "then", "there", "these", "they", "this",
"to", "was", "will", "with"
定义未索引(“停用”)词语的示例
{
"_id": "_design/stop_words_example",
"indexes": {
"INDEX_NAME": {
"analyzer": {
"name": "portuguese",
"stopwords": [
"foo",
"bar",
"baz"
]
},
"index": "function (doc) { ... }"
}
}
}
3.3.2.4. 测试分析器标记化¶
您可以通过将示例数据发布到 _search_analyze
端点来测试分析器标记化的结果。
使用 HTTP 测试关键字分析器的示例
POST /_search_analyze HTTP/1.1
Content-Type: application/json
{"analyzer":"keyword", "text":"[email protected]"}
使用命令行测试关键字分析器的示例
curl 'https://$HOST:5984/_search_analyze' -H 'Content-Type: application/json'
-d '{"analyzer":"keyword", "text":"[email protected]"}'
测试关键字分析器的结果
{
"tokens": [
"[email protected]"
]
}
使用 HTTP 测试标准分析器的示例
POST /_search_analyze HTTP/1.1
Content-Type: application/json
{"analyzer":"standard", "text":"[email protected]"}
使用命令行测试标准分析器的示例
curl 'https://$HOST:5984/_search_analyze' -H 'Content-Type: application/json'
-d '{"analyzer":"standard", "text":"[email protected]"}'
测试标准分析器的结果
{
"tokens": [
"ablanks",
"renovations.com"
]
}
3.3.3. 查询¶
创建搜索索引后,您可以查询它。
使用以下命令发出分区查询:
GET /$DATABASE/_partition/$PARTITION_KEY/_design/$DDOC/_search/$INDEX_NAME
使用以下命令发出全局查询:
GET /$DATABASE/_design/$DDOC/_search/$INDEX_NAME
使用 query
参数指定您的搜索。
使用 HTTP 查询分区索引的示例
GET /$DATABASE/_partition/$PARTITION_KEY/_design/$DDOC/_search/$INDEX_NAME?include_docs=true&query="*:*"&limit=1 HTTP/1.1
Content-Type: application/json
使用 HTTP 查询全局索引的示例
GET /$DATABASE/_design/$DDOC/_search/$INDEX_NAME?include_docs=true&query="*:*"&limit=1 HTTP/1.1
Content-Type: application/json
使用命令行查询分区索引的示例
curl https://$HOST:5984/$DATABASE/_partition/$PARTITION_KEY/_design/$DDOC/
_search/$INDEX_NAME?include_docs=true\&query="*:*"\&limit=1 \
使用命令行查询全局索引的示例
curl https://$HOST:5984/$DATABASE/_design/$DDOC/_search/$INDEX_NAME?
include_docs=true\&query="*:*"\&limit=1 \
3.3.3.1. 查询参数¶
可以在 API 参考 中找到查询参数的完整列表。
您必须启用 分面 才能使用以下参数
counts
drilldown
ranges
注意
不要将 bookmark
和 stale
选项组合使用。这些选项限制了为响应使用的分片副本的选择。当组合使用时,这些选项可能会在尝试联系速度慢或不可用的副本时导致问题。
3.3.3.2. 相关性¶
当可能返回多个结果时,可以对它们进行排序。默认情况下,排序顺序由“相关性”决定。
相关性是根据 Apache Lucene 评分 来衡量的。例如,如果您在一个简单的数据库中搜索单词 example
,则可能有两个文档包含该单词。如果一个文档中提到单词 example
10 次,而第二个文档中只提到两次,那么第一个文档被认为更“相关”。
如果您没有提供 sort
参数,则默认情况下使用相关性。最高评分的匹配项将首先返回。
如果您提供 sort
参数,则匹配项将按该顺序返回,忽略相关性。
如果您想使用 sort
参数,并且还希望在搜索结果中包含按相关性排序,请在 sort
参数中使用特殊字段 -<score>
或 <score>
。
3.3.3.3. 发布搜索查询¶
除了使用 GET
HTTP 方法之外,您还可以使用 POST
。 POST
查询的主要优点是它们可以具有请求主体,因此您可以将请求指定为 JSON 对象。 GET
请求查询字符串中的每个参数都对应于请求主体中 JSON 对象中的一个字段。
使用 HTTP 发布搜索请求的示例
POST /db/_design/ddoc/_search/searchname HTTP/1.1
Content-Type: application/json
使用命令行发布搜索请求的示例
curl 'https://$HOST:5984/db/_design/ddoc/_search/searchname' -X POST -H 'Content-Type: application/json' -d @search.json
包含搜索请求的示例 JSON 文档
{
"q": "index:my query",
"sort": "foo",
"limit": 3
}
3.3.4. 查询语法¶
CouchDB 搜索查询语法基于 Lucene 语法。搜索查询采用 name:value
的形式,除非省略了名称,在这种情况下它们使用默认字段,如下面的示例所示
示例搜索查询表达式
// Birds
class:bird
// Animals that begin with the letter "l"
l*
// Carnivorous birds
class:bird AND diet:carnivore
// Herbivores that start with letter "l"
l* AND diet:herbivore
// Medium-sized herbivores
min_length:[1 TO 3] AND diet:herbivore
// Herbivores that are 2m long or less
diet:herbivore AND min_length:[-Infinity TO 2]
// Mammals that are at least 1.5m long
class:mammal AND min_length:[1.5 TO Infinity]
// Find "Meles meles"
latin_name:"Meles meles"
// Mammals who are herbivore or carnivore
diet:(herbivore OR omnivore) AND class:mammal
// Return all results
*:*
跨多个字段的查询可以进行逻辑组合,并且组和字段可以进一步分组。可用的逻辑运算符区分大小写,分别是 AND
、+
、OR
、NOT
和 -
。范围查询可以在字符串或数字上运行。
如果您想要模糊搜索,您可以使用 ~
运行查询以查找类似于搜索词的词语。例如,look~
会找到词语 book
和 took
。
注意
如果范围查询的上下限都是仅包含数字的字符串,则这些边界将被视为数字,而不是字符串。例如,如果您使用查询 mod_date:["20170101" TO "20171231"]
进行搜索,则结果将包括 mod_date
在数字值 20170101 和 20171231 之间的文档,而不是在字符串“20170101”和“20171231”之间的文档。
您可以通过添加 ^
和一个正数来更改搜索词的重要性。此更改会使包含该词语的匹配项更相关或更不相关,与提升值的幂成正比。默认值为 1,表示匹配强度不会增加或减少。0-1 的小数值会降低重要性,使匹配强度变弱。大于 1 的值会提高重要性,使匹配强度变强。
支持通配符搜索,包括单个字符 (?
) 和多个字符 (*
) 搜索。例如,dat?
将匹配 date
和 data
,而 dat*
将匹配 date
、data
、database
和 dates
。通配符必须出现在搜索词之后。
使用 *:*
返回所有结果。
如果搜索查询没有指定 "group_field"
参数,则响应包含一个书签。如果稍后将此书签作为 URL 参数提供,则响应将跳过已查看的行,从而快速轻松地获取下一组结果。
注意
如果搜索查询中包含 "group_field"
参数,则响应永远不会包含书签。请参阅 group_field 参数。
注意
group_field
、group_limit
和 group_sort
选项仅在进行全局查询时可用。
以下字符需要转义,如果您想搜索它们
+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ /
要转义这些字符之一,请使用前导反斜杠字符 (\
)。
搜索查询的响应包含每个结果的 order
字段。 order
字段是一个数组,其中第一个元素是 sort
参数中指定的字段。请参阅 sort 参数。如果查询中不包含 sort
参数,则 order
字段包含 Lucene 相关性评分。如果您使用“按距离排序”功能(如 地理搜索 中所述),则第一个元素是距某个点的距离。距离使用公里或英里测量。
注意
顺序数组中的第二个元素可以忽略。它仅用于故障排除目的。
3.3.4.1. 分面¶
CouchDB Search 还支持分面搜索,使您可以快速轻松地发现有关匹配项的聚合信息。您可以使用特殊的 ?q=*:*
查询语法匹配所有文档,并使用返回的分面来细化您的查询。要指示必须为分面查询索引某个字段,请在其选项中设置 {"facet": true}
。
指定启用分面搜索的搜索查询示例
function(doc) {
index("type", doc.type, {"facet": true});
index("price", doc.price, {"facet": true});
}
要使用分面,索引中的所有文档都必须包含所有启用了分面的字段。如果您的文档不包含所有字段,您将收到一个 bad_request
错误,原因是“field_name
不存在”。如果每个文档不包含所有分面字段,请为每个字段创建单独的索引。如果您没有为每个字段创建单独的索引,则您必须仅包含包含所有字段的文档。使用单个 if
语句验证每个文档中是否存在字段。
验证每个文档中是否存在所需字段的 if 语句示例
if (typeof doc.town == "string" && typeof doc.name == "string") {
index("town", doc.town, {facet: true});
index("name", doc.name, {facet: true});
}
3.3.4.2. 计数¶
注意
counts
选项仅在进行全局查询时可用。
counts
分面语法采用字段列表,并返回每个命名字段的每个唯一值的查询结果数量。
注意
count
操作仅在索引值为字符串时有效。索引值不能是混合类型。例如,如果索引了 100 个字符串和一个数字,则该索引不能用于 count
操作。您可以使用 typeof
运算符检查类型,并使用 parseInt
、parseFloat
或 .toString()
函数进行转换。
使用 counts 分面语法的查询示例
?q=*:*&counts=["type"]
使用 counts 分面语法后的响应示例
{
"total_rows":100000,
"bookmark":"g...",
"rows":[...],
"counts":{
"type":{
"sofa": 10,
"chair": 100,
"lamp": 97
}
}
}
3.3.4.3. 下钻¶
注意
drilldown
选项仅在进行全局查询时可用。
您可以将结果限制为维度等于指定标签的文档。通过在搜索查询中添加 drilldown=["dimension","label"]
来限制结果。您可以包含多个 drilldown
参数来沿多个维度限制结果。
GET /things/_design/inventory/_search/fruits?q=*:*&drilldown=["state","old"]&drilldown=["item","apple"]&include_docs=true HTTP/1.1
为了更好地进行语言互操作性,您可以通过提供列表列表来实现相同的效果
GET /things/_design/inventory/_search/fruits?q=*:*&drilldown=[["state","old"],["item","apple"]]&include_docs=true HTTP/1.1
您也可以在 POST 请求的主体中为 drilldown
提供列表列表。
请注意,单个键的多个 drilldown
值意味着它们之间存在 OR
关系,并且多个键之间存在 AND
关系。
使用 drilldown
参数类似于在 q
参数中使用 key:value
,但 drilldown
参数返回分析器可能跳过的值。
例如,如果分析器没有索引像 "a"
这样的停用词,则使用 drilldown
会在您指定 drilldown=["key","a"]
时返回它。
3.3.4.4. 范围¶
注意
ranges
选项仅在进行全局查询时可用。
range
分面语法重用标准 Lucene 语法来表示范围,以返回适合每个指定类别的结果计数。包含范围查询由方括号 ([
, ]
) 表示。排除范围查询由花括号 ({
, }
) 表示。
注意
range
操作仅在索引值为数字时有效。索引值不能是混合类型。例如,如果索引了 100 个字符串和一个数字,则该索引不能用于 range
操作。您可以使用 typeof
运算符检查类型,并使用 parseInt
、parseFloat
或 .toString()
函数进行转换。
使用分面搜索匹配范围的请求示例
?q=*:*&ranges={"price":{"cheap":"[0 TO 100]","expensive":"{100 TO Infinity}"}}
对分面搜索进行范围检查后的结果示例
{
"total_rows":100000,
"bookmark":"g...",
"rows":[...],
"ranges": {
"price": {
"expensive": 278682,
"cheap": 257023
}
}
}
3.3.5. 地理搜索¶
除了按文本字段的内容进行搜索外,您还可以使用 Lucene 的内置地理空间功能按结果距地理坐标的距离进行排序。
要按这种方式对结果进行排序,您必须索引两个数字字段,分别表示经度和纬度。
注意
您还可以使用 Lucene 的内置地理空间功能按结果距地理坐标的距离进行排序。
然后,您可以使用特殊的 <distance...>
排序字段进行查询,该字段接受五个参数
经度字段名称:经度字段的名称(示例中为
mylon
)。纬度字段名称:纬度字段的名称(示例中为
mylat
)。原点经度:您要按距离排序的点的经度。
原点纬度:您要按距离排序的点的纬度。
单位:要使用的单位:
km
表示公里,mi
表示英里。距离在 order 字段中返回。
您可以将按距离排序与任何其他搜索查询相结合,例如对纬度和经度进行范围搜索,或涉及非地理信息的查询。
这样,您就可以在边界框中搜索,并使用额外的条件缩小搜索范围。
地理数据示例
{
"name":"Aberdeen, Scotland",
"lat":57.15,
"lon":-2.15,
"type":"city"
}
包含地理数据搜索索引的设计文档示例
function(doc) {
if (doc.type && doc.type == 'city') {
index('city', doc.name, {'store': true});
index('lat', doc.lat, {'store': true});
index('lon', doc.lon, {'store': true});
}
}
使用 HTTP 对按距离对北半球城市进行排序的查询的示例
GET /examples/_design/cities-designdoc/_search/cities?q=lat:[0+TO+90]&sort="<distance,lon,lat,-74.0059,40.7127,km>" HTTP/1.1
使用命令行对按距离对北半球城市进行排序的查询的示例
curl 'https://$HOST:5984/examples/_design/cities-designdoc/_search/cities?q=lat:[0+TO+90]&sort="<distance,lon,lat,-74.0059,40.7127,km>"'
响应示例(缩写),包含按距离到纽约的距离排序的北半球城市列表
{
"total_rows": 205,
"bookmark": "g1A...XIU",
"rows": [
{
"id": "city180",
"order": [
8.530665755719783,
18
],
"fields": {
"city": "New York, N.Y.",
"lat": 40.78333333333333,
"lon": -73.96666666666667
}
},
{
"id": "city177",
"order": [
13.756343205985946,
17
],
"fields": {
"city": "Newark, N.J.",
"lat": 40.733333333333334,
"lon": -74.16666666666667
}
},
{
"id": "city178",
"order": [
113.53603438866077,
26
],
"fields": {
"city": "New Haven, Conn.",
"lat": 41.31666666666667,
"lon": -72.91666666666667
}
}
]
}
3.3.6. 突出显示搜索词¶
有时,获取搜索词提及的上下文非常有用,这样您就可以向用户显示更突出的结果。
要获得更突出的结果,请在搜索查询中添加 highlight_fields
参数。指定您希望获取摘录的字段名称,以及返回的突出显示的搜索词。
默认情况下,搜索词将放置在 <em>
标签中以突出显示它,但可以使用 highlights_pre_tag
和 highlights_post_tag
参数覆盖突出显示。
片段的长度默认值为 100 个字符。可以使用 highlights_size
参数请求不同的长度。
参数 highlights_number
控制返回的片段数量,默认值为 1。
在响应中,添加了一个 highlights
字段,每个字段名称对应一个子字段。
对于每个字段,您将收到一个包含突出显示搜索词的片段数组。
注意
要使突出显示功能正常工作,请使用 store: true
选项将字段存储在索引中。
使用 HTTP 搜索并启用突出显示的示例
GET /movies/_design/searches/_search/movies?q=movie_name:Azazel&highlight_fields=["movie_name"]&highlight_pre_tag="**"&highlight_post_tag="**"&highlights_size=30&highlights_number=2 HTTP/1.1
Authorization: ...
使用命令行搜索并启用突出显示的示例
curl "https://$HOST:5984/movies/_design/searches/_search/movies?q=movie_name:Azazel&highlight_fields=\[\"movie_name\"\]&highlight_pre_tag=\"**\"&highlight_post_tag=\"**\"&highlights_size=30&highlights_number=2
突出显示的搜索结果示例
{
"highlights": {
"movie_name": [
" on the Azazel Orient Express",
" Azazel manuals, you"
]
}
}