Существующий HTTP‑интерфейс предоставляет только простую функциональность. Новые конечные точки, добавленные в Manticore Search 2.5.1, запускают новый API.
До настоящего времени существовало 2 конечные точки:
- /search - выполнять поисковые запросы в простом формате
- /sql - выполнять SELECT SphinxQL, тем самым позволяя переиспользовать поиск в формате SphinxQL без использования MySQL‑клиента
Новая конечная точка, /json , в отличие от первых двух, стремится предоставить собственный API, использующий JSON поверх HTTP как в запросах, так и в ответах.
Некоторые могут спросить, зачем добавлять новый API, если у нас уже есть SphinxQL? Каковы будут его преимущества?
Для использования Manticore Search обычно используют SphinxQL. Синтаксис почти такой же, как у существующих SQL‑протоколов, и нужен лишь клиент MySQL или библиотека. HTTP‑интерфейс требует HTTP‑клиент, и большинство языков уже имеют его, поэтому нет необходимости устанавливать дополнительные пакеты, а ещё лучше — можно просто использовать браузер (с расширением REST API) для подключения к движку и выполнения тестов. Также бывают случаи, когда пользователи вовсе не используют MySQL или традиционную базу данных и ожидают, как и в других проектах, HTTP‑протокол.
Второе, и более важное преимущество, заключается в том, что использование JSON поверх HTTP позволяет делать более сложные запросы и ответы. В будущем мы могли бы добавить конечные точки, способные выполнять не один запрос, а несколько связанных между собой (например, использовать результаты одного запроса в параметрах другого) и ответы, содержащие более сложные структуры, чем просто набор строк.
Текущие конечные точки для манипуляций данными включают /json/insert , /json/update , /json/replace и /json/delete . Существует также /bulk, позволяющий пакетировать операции манипуляции данными разных типов. Обратите внимание, что /json/bulk требует тело запроса в виде newline-delimited json .
Поиск доступен на конечной точке /json/search . Поиск организован как абстрактное синтаксическое дерево запросов, вложенное в объект JSON, и может содержать листовые условия запросов, такие как "match", "range", "sort" (используется для full-text matches , attribute filtering ) или составные условия запросов, такие как "bool" (для логического объединения других запросов) или поведенческие условия (например, "profile" для включения профилирования запросов в ответе). Text highlighting также может быть указано в запросе, чтобы получить выделенный фрагмент в ответе. Геодистанция также поддерживается и может использоваться при сортировке. Улучшения и новые команды будут добавлены в будущих релизах.
Простой пример поиска фразы:
curl -X POST 'http://localhost:9308/json/search' -d '{"index":"geodemo","query":{"match_phrase":{"name":"Gloucester City Middle School"}}}'
И ответ:
{
"took": 1,
"timed_out": false,
"hits": {
"total": 1,
"hits": [
{
"_id": "7142245",
"_score": 4609,
"_source": {
"elevation": 0,
"population": 0,
"latitude": 0.69612807035446167,
"longitude": -1.3109307289123535,
"latitude_deg": 39.885200500488281,
"longitude_deg": -75.110801696777344,
"name": "Gloucester City Middle School and High School",
"feature_code": "SCH",
"country_code": "US",
"state_code": "NJ",
"level3_code": "",
"level4_code": "",
"dem": "",
"timezone": ""
}
}
]
}
}
API всё ещё находится на ранней стадии. Мы стремимся к синтаксису, похожему на Query DSL, и многие возможности, доступные в SphinxQL, ещё не перенесены. Для этого нам нужен отклик от пользователей, желающих использовать JSON‑запросы вместо существующих API. Попробуйте и дайте нам знать, что вы об этом думаете!