Apache CouchDB® Logo
3.1

Table of Contents

用户指南

  • 1. 介绍
  • 2. 复制
  • 3. 设计文件
    • 3.1. 设计文件
    • 3.2. 观景指南
    • 3.3. 搜索
      • 3.3.1. 索引函数
        • 3.3.1.1. 索引保护条款
      • 3.3.2. 分析者
        • 3.3.2.1. 特定语言分析器
        • 3.3.2.2. 每个现场分析仪
        • 3.3.2.3. 停用词
        • 3.3.2.4. 测试分析器标记化
      • 3.3.3. 查询
        • 3.3.3.1. 查询参数
        • 3.3.3.2. 关联
        • 3.3.3.3. 过帐搜索查询
      • 3.3.4. 查询语法
        • 3.3.4.1. 刻面
        • 3.3.4.2. 计数
        • 3.3.4.3. 向下钻取
        • 3.3.4.4. 范围
      • 3.3.5. 地理搜索
      • 3.3.6. 突出显示搜索词
  • 4. 最佳实践

管理指南

  • 1. 安装
  • 2. 安装程序
  • 3. 配置
  • 4. 集群管理
  • 5. 维护
  • 6. 福克斯顿
  • 7. 实验特性

参考指南

  • 1. API引用
  • 2. JSON结构引用
  • 3. 查询服务器
  • 4. 分区数据库

其他

  • 1. 发行说明
  • 2. 安全问题/CVE
  • 3. 报告apachecouchdb的新安全问题
  • 4. License
  • 5. 为本文档提供帮助

Quick Reference Guides

  • API Quick Reference
  • Configuration Quick Reference

More Help

  • CouchDB Homepage
  • Mailing Lists
  • Realtime Chat
  • Issue Tracker
  • Download Docs
Apache CouchDB®
  • Docs »
  • 3. 设计文件 »
  • 3.3. 搜索

3.3. 搜索¶

搜索索引使您能够使用 Lucene Query Parser Syntax. 搜索索引使用文档中的一个或多个字段。您可以使用搜索索引来运行查询,根据文档包含的内容查找文档,或者使用组、方面或地理位置搜索。

警告

除非有一个正常运行的、连接到集群的Clouseau实例,否则搜索无法运行。看到了吗 Search Plugin Installation 有关详细信息。

要创建搜索索引,可以向数据库中的设计文档添加JavaScript函数。索引是在处理一个搜索请求或服务器检测到文档更新后生成的。这个 index 函数采用以下参数:

1字段名-查询索引时要使用的字段的名称。如果将此参数设置为 default ,则如果查询语法中未指定字段,则查询此字段。

  1. 例如,要索引的数据, 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. 索引函数¶

尝试使用不存在的数据字段编制索引失败。要避免此问题,请使用适当的 guard clause .

注解

索引函数在内存受限的环境中运行,文档本身是该环境中使用的内存的一部分。您的代码堆栈和文档必须适合此内存。换句话说,必须加载文档才能编制索引。文档的最大大小限制为64 MB。

注解

在搜索索引中,不要用多个数据类型索引同一字段名。如果同一字段名在同一个搜索索引函数中使用不同的数据类型编制索引,则在查询显示字段“已编制索引但没有位置数据”的搜索索引时,可能会出现错误。例如,不要将这两行都包含在同一个搜索索引函数中,因为它们为 myfield 字段作为两种不同的数据类型:字符串 "this is a string" 还有一个数字 123 .

index("myfield", "this is a string");
index("myfield", 123);

index字段中包含的函数是一个JavaScript函数,它为数据库中的每个文档调用。函数将文档作为参数,从中提取一些数据,然后调用在中定义的函数 index 字段来索引该数据。

这个 index 函数接受三个参数,其中第三个参数是可选的。

第一个参数是查询索引时要使用的字段的名称,它在后续查询的Lucene语法部分指定。以下查询中将显示一个示例:

query=color:red

Lucene字段名 color 的第一个参数 index 功能。

这个 query 参数可以缩写为 q ,因此另一种编写查询的方法如下:

q=color:red

如果特殊值 "default" 在定义名称时使用,不必在查询时指定字段名。其效果是可以简化查询:

query=red

第二个参数是要索引的数据。索引数据时,请记住以下信息:

  • 此数据只能是字符串、数字或布尔值。其他类型将导致索引函数调用引发错误。
  • 如果在运行函数时由于这个原因或其他原因抛出了错误,文档将不会添加到该搜索索引中。

第三个可选参数是一个JavaScript对象,包含以下字段:

索引函数(可选参数)

  • 促进 -指定搜索结果中相关性的数字。索引的boost值大于1的内容比索引没有boost值的内容更相关。boost值小于1的内容就不那么相关了。值是一个正浮点数。默认值为1(无增压)。
  • 方面 -创建分面索引。看到了吗 Faceting .值为 true 或 false . 默认是 false .
  • 指数 -数据是否被索引,如果是,如何索引。如果设置为 false ,则无法将数据用于搜索,但如果 store 设置为 true . 见 Analyzers .值为 true 或 false . 默认是 true
  • 商店 -如果 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 函数要求将要索引的数据字段的名称作为第二个参数。但是,如果文档不存在该数据字段,则会发生错误。解决方案是使用适当的“guard子句”,检查字段是否存在,并包含预期的数据类型, 之前 创建相应索引的任何尝试。

无法检查索引数据字段是否存在的示例:

if (doc.min_length) {
    index("min_length", doc.min_length, {"store": true});
}

您可以使用JavaScript typeof 执行保护条款测试功能。如果字段存在 and 具有所需的类型,则返回正确的类型名,因此guard子句测试成功,使用index函数是安全的。如果现场有 not 如果存在,则无法获取字段的预期类型,因此不会尝试索引字段。

如果测试以下值之一,JavaScript将认为结果为false:

  • '未定义'
  • 无效的
  • 数字+0
  • 数字-0
  • 南(不是数字)
  • “”(空字符串)

在尝试索引之前,使用guard子句检查所需的数据字段是否存在并包含一个数字:

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. 分析者¶

分析器是定义如何识别文本中的术语的设置。如果需要的话,分析器会很有帮助 index multiple languages .

以下是search支持的通用分析器及其说明的列表:

  • classic -标准的Lucene分析仪,大约3.1版。
  • email -就像 standard 分析器,但更难将电子邮件地址匹配为完整令牌。
  • keyword -输入根本没有标记化。
  • simple -以非字母分隔文本。
  • standard - The default analyzer. It implements the Word Break rules from the Unicode Text Segmentation algorithm
  • whitespace -在空白边界处分隔文本。

analyzer文档示例:

{
    "_id": "_design/analyzer_example",
    "indexes": {
        "INDEX_NAME": {
            "index": "function (doc) { ... }",
            "analyzer": "$ANALYZER_NAME"
        }
    }
}

3.3.2.1. 特定语言分析器¶

这些分析程序省略了特定语言中的常用词,而且许多分析程序也省略了这些词 remove prefixes and suffixes . 语言的名称也是分析器的名称。看到了吗 package org.apache.lucene.analysis 更多信息。

语言 分析仪
arabic org.apache.lucene.analysis.ar.ArabicAnalyzer
armenian org.apache.lucene.analysis.hy.ArmenianAnalyzer
basque org.apache.lucene.analysis.eu.BasqueAnalyzer
bulgarian org.apache.lucene.analysis.bg.BulgarianAnalyzer
brazilian org.apache.lucene.analysis.br.BrazilianAnalyzer
catalan org.apache.lucene.analysis.ca.CatalanAnalyzer
cjk org.apache.lucene.analysis.cjk.CJKAnalyzer
chinese org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer
czech org.apache.lucene.analysis.cz.CzechAnalyzer
danish org.apache.lucene.analysis.da.DanishAnalyzer
dutch org.apache.lucene.analysis.nl.DutchAnalyzer
english org.apache.lucene.analysis.en.EnglishAnalyzer
finnish org.apache.lucene.analysis.fi.FinnishAnalyzer
french org.apache.lucene.analysis.fr.FrenchAnalyzer
german org.apache.lucene.analysis.de.GermanAnalyzer
greek org.apache.lucene.analysis.el.GreekAnalyzer
galician org.apache.lucene.analysis.gl.GalicianAnalyzer
hindi org.apache.lucene.analysis.hi.HindiAnalyzer
hungarian org.apache.lucene.analysis.hu.HungarianAnalyzer
indonesian org.apache.lucene.analysis.id.IndonesianAnalyzer
irish org.apache.lucene.analysis.ga.IrishAnalyzer
italian org.apache.lucene.analysis.it.ItalianAnalyzer
japanese org.apache.lucene.analysis.ja.JapaneseAnalyzer
japanese org.apache.lucene.analysis.ja.JapaneseTokenizer
latvian org.apache.lucene.analysis.lv.LatvianAnalyzer
norwegian org.apache.lucene.analysis.no.NorwegianAnalyzer
persian org.apache.lucene.analysis.fa.PersianAnalyzer
polish org.apache.lucene.analysis.pl.PolishAnalyzer
portuguese org.apache.lucene.analysis.pt.PortugueseAnalyzer
romanian org.apache.lucene.analysis.ro.RomanianAnalyzer
russian org.apache.lucene.analysis.ru.RussianAnalyzer
spanish org.apache.lucene.analysis.es.SpanishAnalyzer
swedish org.apache.lucene.analysis.sv.SwedishAnalyzer
thai org.apache.lucene.analysis.th.ThaiAnalyzer
turkish org.apache.lucene.analysis.tr.TurkishAnalyzer

注解

这个 japanese 分析仪,org.apache.lucene.日本麻醉剂分析,包括默认模式和默认停止标记。

注解

语言特定的分析器针对指定的语言进行了优化。不能将泛型分析器与特定于语言的分析器结合使用。相反,您可以使用 per field analyzer 为文档中的不同字段选择不同的分析器。

3.3.2.2. 每个现场分析仪¶

这个 perfield analyzer为不同字段配置多个分析器。

为不同字段定义不同分析器的示例:

{
    "_id": "_design/analyzer_example",
    "indexes": {
        "INDEX_NAME": {
            "analyzer": {
                "name": "perfield",
                "default": "english",
                "fields": {
                    "spanish": "spanish",
                    "german": "german"
                }
            },
            "index": "function (doc) { ... }"
        }
    }
}

3.3.2.3. 停用词¶

停止词不是索引词。通过将分析器字符串转换为对象,可以在设计文档中定义它们。

注解

这个 keyword , simple 和 whitespace 分析器不支持停止字。

的默认停止字 standard 分析仪包括:

"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"

Example of defining non-indexed ('stop') words:

{
    "_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":"ablanks@renovations.com"}

使用命令行测试关键字分析器的示例:

curl 'https://$HOST:5984/_search_analyze' -H 'Content-Type: application/json'
    -d '{"analyzer":"keyword", "text":"ablanks@renovations.com"}'

关键字分析器测试结果:

{
    "tokens": [
        "ablanks@renovations.com"
    ]
}

使用HTTP测试标准分析器的示例:

POST /_search_analyze HTTP/1.1
Content-Type: application/json
{"analyzer":"standard", "text":"ablanks@renovations.com"}

使用命令行测试标准分析器的示例:

curl 'https://$HOST:5984/_search_analyze' -H 'Content-Type: application/json'
    -d '{"analyzer":"standard", "text":"ablanks@renovations.com"}'

标准分析仪测试结果:

{
    "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 Reference .

您必须启用 faceting 在使用以下参数之前:

  • counts
  • drilldown
  • ranges

注解

不要将 bookmark 和 stale 选项。这些选项限制了用于响应的碎片副本的选择。当一起使用时,当尝试与速度较慢或不可用的副本联系时,这些选项可能会导致问题。

3.3.3.2. 关联¶

当可能返回多个结果时,可以对它们进行排序。默认情况下,排序顺序由“相关性”决定。

相关性根据 Apache Lucene Scoring . 例如,如果您在一个简单的数据库中搜索 example ,两个文档可能包含该单词。如果一份文件提到 example 10次,但第二份文件只提到了两次,那么第一份文件就被认为更“相关”。

如果您不提供 sort 参数,默认情况下使用相关性。得分最高的比赛将首先返回。

如果你提供 sort 参数,则按该顺序返回匹配项,忽略相关性。

如果你想用 sort 参数,并在搜索结果中包括按相关性排序,请使用特殊字段 -<score> 或 <score> 内 sort 参数。

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 syntax. 搜索查询的形式为 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”之间。

您可以通过添加 ^ 一个正数。这种改变使得包含术语的匹配或多或少相关,与boost值的幂成比例。强度值增加或减小表示不匹配。十进制值0-1会降低重要性。使比赛强度变弱。大于1的值会增加重要性,使比赛强度更强。

支持通配符搜索,对于两个单一 (? )和多个 (* )字符搜索。例如, dat? 将匹配 date 和 data 而 dat* 将匹配 date , data , database 和 dates . 通配符必须在搜索词之后。

使用 *:* 返回所有结果。

如果搜索查询 not 指定 "group_field" 参数,则响应包含书签。如果稍后将此书签作为URL参数提供,则响应将跳过已经看到的行,从而可以快速轻松地获得下一组结果。

注解

如果 "group_field" 参数包含在搜索查询中。看到了吗 group_field parameter .

注解

这个 group_field , group_limit 和 group_sort 选项仅在进行全局查询时可用。

如果要搜索以下字符,则需要转义:

+ - && || ! ( ) { } [ ] ^ " ~ * ? : \ /

要转义其中一个字符,请使用前面的反斜杠字符 (\ )

对搜索查询的响应包含 order 每个结果的字段。这个 order 字段是一个数组,其中第一个元素是在 sort 参数。查看 sort parameter . 如果没有 sort 参数包含在查询中,则 order 包含 Lucene relevance score . 如果您使用中所述的“按距离排序”功能 geographical searches ,则第一个元素是与点的距离。用公里或英里来测量距离。

注解

可以忽略order数组中的第二个元素。它仅用于故障排除目的。

3.3.4.1. 刻面¶

CouchDB Search还支持分面搜索,可以快速、轻松地发现关于匹配项的聚合信息。您可以使用特殊 ?q=*:* 查询语法,并使用返回的facet优化查询。若要指示字段必须为分面查询编制索引,请设置 {{"facet": true}} 在它的选择中。

搜索查询示例,指定启用分面搜索:

function(doc) {
    index("type", doc.type, {"facet": true});
    index("price", doc.price, {"facet": true});
}

要使用facet,索引中的所有文档必须包含启用faceting的所有字段。如果文档不包括所有字段,则会收到 bad_request 错误原因如下 field_name 如果每个文档不包含facet的所有字段,请为每个字段创建单独的索引。如果不为每个字段创建单独的索引,则必须只包含包含所有字段的文档。使用单个 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 facet语法的查询示例:

?q=*:*&counts=["type"]

使用counts facet语法后的示例响应:

{
    "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

您还可以提供 drilldown 在邮件请求的正文中。

请注意,在 drilldown 意思是 OR 他们之间的关系 AND 多个键之间的关系。

使用A drilldown 参数类似于使用 key:value 在 q 参数,但是 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 好几英里。将在“订单”字段中返回距离。

可以将按距离排序与任何其他搜索查询(例如纬度和经度上的范围搜索或涉及非地理信息的查询)结合使用。

这样,您可以在边界框中搜索,并使用额外的条件缩小搜索范围。

地理数据示例:

{
    "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。

在回答中,a 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"
        ]
    }
}
Next Previous

© Copyright 2021, Apache Software Foundation. CouchDB® is a registered trademark of the Apache Software Foundation.

Built with Sphinx using a theme provided by Read the Docs.