Поиск
Поисковые индексы позволяют выполнять запросы к базе данных с использованием синтаксиса анализатора запросов 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 проектного документа, в котором он содержится.
Функции индекса
Попытка индексировать данные из несуществующего поля завершится ошибкой. Чтобы избежать этой проблемы, используйте соответствующее условие-предохранитель.
Примечание
Функции индексирования работают в среде с ограниченным объёмом памяти, где сам документ занимает часть доступной памяти. Стек вашего кода и документ должны помещаться в эту память. Иными словами, для индексирования документ необходимо загрузить. Максимальный размер документов ограничен 64 МБ.
Примечание
В одном поисковом индексе не индексируйте одно и то же имя поля с более чем одним типом данных. Если одно и то же имя поля индексируется с разными типами данных в одной функции поискового индекса, при запросе к поисковому индексу может возникнуть ошибка с сообщением, что поле «было индексировано без данных о позициях». Например, не включайте обе эти строки в одну функцию поискового индекса, так как они индексируют поле 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 — число, задающее релевантность в результатах поиска. Содержимое, индексированное со значением boost больше 1, релевантнее содержимого, индексированного без значения boost. Содержимое со значением boost меньше единицы менее релевантно. Значение — положительное число с плавающей точкой. По умолчанию равно 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});
}
} Условия-предохранители индекса
Функции index требуется имя поля данных для индексирования в качестве второго параметра. Однако если у документа нет такого поля данных, возникает ошибка. Решение — использовать подходящее «условие-предохранитель», которое проверяет, существует ли поле и содержит ли оно данные ожидаемого типа, до любой попытки создать соответствующий индекс.
Пример отсутствия проверки на существование поля данных индекса:
if (doc.min_length) {
index("min_length", doc.min_length, {"store": true});
} Для реализации проверки в условии-предохранителе можно использовать функцию JavaScript typeof. Если поле существует и имеет ожидаемый тип, возвращается правильное имя типа, поэтому проверка в условии-предохранителе проходит успешно и функцию индекса можно безопасно использовать. Если поле не существует, ожидаемый тип поля не будет возвращён, поэтому индексировать поле не следует.
JavaScript считает результат ложным, если проверяется одно из следующих значений:
«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.
...
} Анализаторы
Анализаторы — это настройки, определяющие способ распознавания терминов в тексте. Анализаторы могут быть полезны, если вам нужно индексировать тексты на нескольких языках.
Ниже приведён список универсальных анализаторов, поддерживаемых поиском, с их описаниями:
classic— стандартный анализатор Lucene, версия около выпуска 3.1.email— похож на анализаторstandard, но пытается распознавать адрес электронной почты как единый токен.keyword— входные данные не разбиваются на токены.simple— разделяет текст по символам, не являющимся буквами.standard— анализатор по умолчанию. Он реализует правила разбиения слов из алгоритма сегментации текста Unicode.whitespace— разделяет текст по пробельным символам.
Пример документа анализатора:
{
"_id": "_design/analyzer_example",
"indexes": {
"INDEX_NAME": {
"index": "function (doc) { ... }",
"analyzer": "$ANALYZER_NAME"
}
}
} Языковые анализаторы
Эти анализаторы исключают распространённые слова на соответствующем языке, а многие из них также удаляют префиксы и суффиксы. Название языка также является названием анализатора. Дополнительные сведения см. в разделе пакета 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 |
Примечание
Анализатор japanese, org.apache.lucene.analysis.ja.JapaneseTokenizer, включает DEFAULT_MODE и defaultStopTags.
Примечание
Языковые анализаторы оптимизированы для указанного языка. Нельзя сочетать универсальный анализатор с языковым. Вместо этого можно использовать анализатор для каждого поля, чтобы выбирать разные анализаторы для разных полей документов.
Анализаторы для отдельных полей
Анализатор perfield настраивает несколько анализаторов для разных полей.
Пример определения разных анализаторов для разных полей:
{
"_id": "_design/analyzer_example",
"indexes": {
"INDEX_NAME": {
"analyzer": {
"name": "perfield",
"default": "english",
"fields": {
"spanish": "spanish",
"german": "german"
}
},
"index": "function (doc) { ... }"
}
}
} Стоп-слова
Стоп-слова — это слова, которые не индексируются. Их можно определить в проектном документе, преобразовав строку анализатора в объект.
Примечание
Анализаторы 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"
Пример определения неиндексируемых («стоп») слов:
{
"_id": "_design/stop_words_example",
"indexes": {
"INDEX_NAME": {
"analyzer": {
"name": "portuguese",
"stopwords": [
"foo",
"bar",
"baz"
]
},
"index": "function (doc) { ... }"
}
}
} Проверка токенизации анализатора
Результаты токенизации анализатора можно проверить, отправив образец данных на конечную точку _search_analyze.
Пример проверки анализатора keyword с помощью HTTP:
POST /_search_analyze HTTP/1.1
Content-Type: application/json
{"analyzer":"keyword", "text":"ablanks@renovations.com"} Пример проверки анализатора keyword из командной строки:
curl 'https://$HOST:5984/_search_analyze' -H 'Content-Type: application/json'
-d '{"analyzer":"keyword", "text":"ablanks@renovations.com"}' Результат проверки анализатора keyword:
{
"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"
]
} Запросы
После создания поискового индекса можно выполнять к нему запросы.
Выполните запрос к секции с помощью:
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 \
Параметры запроса
справочнике API.
Перед использованием следующих параметров необходимо включить фасетный поиск:
countsdrilldownranges
Примечание
Не используйте вместе параметры bookmark и stale. Эти параметры ограничивают выбор реплик шардов, используемых для ответа. При совместном использовании они могут вызвать проблемы при попытке связаться с медленными или недоступными репликами.
Релевантность
Если может быть возвращено более одного результата, их можно отсортировать. По умолчанию порядок сортировки определяется «релевантностью».
Релевантность измеряется согласно системе оценки Apache Lucene. Например, если выполнить поиск слова example в простой базе данных, это слово может встретиться в двух документах. Если в одном документе слово example встречается 10 раз, а во втором — только два раза, первый документ считается более «релевантным».
Если параметр sort не указан, по умолчанию используется релевантность. Сначала возвращаются совпадения с наивысшей оценкой.
Если указан параметр sort, совпадения возвращаются в этом порядке, без учёта релевантности.
Если вы хотите использовать параметр sort и одновременно включить сортировку результатов поиска по релевантности, используйте специальные поля -<score> или <score> в параметре sort.
Отправка поисковых запросов методом POST
Вместо HTTP-метода GET также можно использовать POST. Главное преимущество запросов POST заключается в том, что они могут содержать тело запроса, позволяя задать запрос в виде объекта JSON. Каждый параметр в строке запроса GET соответствует полю объекта JSON в теле запроса.
Пример отправки поискового запроса методом POST с помощью HTTP:
POST /db/_design/ddoc/_search/searchname HTTP/1.1 Content-Type: application/json
Пример отправки поискового запроса методом POST из командной строки:
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
} Синтаксис запросов
Синтаксис поисковых запросов 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».
Можно изменить важность поискового термина, добавив ^ и положительное число. Это изменение делает совпадения, содержащие термин, более или менее релевантными пропорционально степени значения boost. По умолчанию используется значение 1, то есть сила совпадения не увеличивается и не уменьшается. Десятичное значение от 0 до 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. Если используется функция «сортировка по расстоянию», описанная в разделе географический поиск, первый элемент — это расстояние от точки. Расстояние измеряется в километрах или милях.
Примечание
Второй элемент массива порядка можно игнорировать. Он используется только для устранения неполадок.
Фасетный поиск
Поиск CouchDB также поддерживает фасетный поиск, позволяющий быстро и просто находить агрегированную информацию о совпадениях. Можно сопоставить все документы с помощью специального синтаксиса запроса ?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});
} Подсчёт
Примечание
Параметр counts доступен только для глобальных запросов.
Синтаксис фасета counts принимает список полей и возвращает количество результатов запроса для каждого уникального значения каждого указанного поля.
Примечание
Операция count работает, только если индексированные значения являются строками. Типы индексированных значений не могут смешиваться. Например, если индексировано 100 строк и одно число, индекс нельзя использовать для операций count. Проверить тип можно с помощью оператора typeof, а преобразовать его — с помощью функций parseInt, parseFloat или .toString().
Пример запроса с использованием синтаксиса фасета подсчёта:
?q=*:*&counts=["type"]
Пример ответа после использования синтаксиса фасета подсчёта:
{
"total_rows":100000,
"bookmark":"g...",
"rows":[...],
"counts":{
"type":{
"sofa": 10,
"chair": 100,
"lamp": 97
}
}
} Детализация
Примечание
Параметр 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 в телах POST-запросов.
Обратите внимание: несколько значений для одного ключа в drilldown задают отношение OR между ними, а между несколькими ключами действует отношение AND.
Использование параметра drilldown аналогично использованию key:value в параметре q, но параметр drilldown возвращает значения, которые анализатор может пропустить.
Например, если анализатор не индексировал стоп-слово, например "a", параметр drilldown возвращает его при указании drilldown=["key","a"].
Диапазоны
Примечание
Параметр 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
}
}
} Географический поиск
Помимо поиска по содержимому текстовых полей, вы также можете сортировать результаты по расстоянию от географических координат, используя встроенные в 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
}
}
]
} Подсветка поисковых терминов
Иногда полезно получить контекст, в котором упоминается поисковый термин, чтобы показывать пользователю более наглядные результаты.
Чтобы получить более наглядные результаты, добавьте параметр 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"
]
}
}
Copyright © 2025 The Apache Software Foundation — Licensed under the Apache License 2.0
https://docs.couchdb.org/en/3.5.1/ddocs/search.html