Searchkit — это библиотека с открытым исходным кодом, которая помогает вам улучшить качество поиска с помощью Elasticsearch . Работает с Javascript, React, Vue, Angular и другими.
Веб-сайт | Демо | Документация | Раздор
Searchkit предоставляет пользовательский интерфейс поиска для Elasticsearch или Opensearch. С помощью Searchkit вы можете использовать компоненты Instantsearch, такие как поле поиска, фильтры уточнения и результаты (и многое другое!), чтобы улучшить качество поиска.
Searchkit отлично подходит для тех, кто хочет быстро создать возможности поиска.
Searchkit упрощает пользовательский интерфейс поиска с помощью Elasticsearch:
Searchkit Bot поможет вам лучше понять этот репозиторий. Вы можете запросить примеры кода, руководство по установке, помощь по отладке и многое другое.
Или ознакомьтесь с нашей документацией для получения дополнительных примеров.
Либо установите через npm, либо через пряжу.
npm install searchkit @searchkit/api @searchkit/instantsearch-client
или через CDN
< script src =" https://cdn.jsdelivr.net/npm/@searchkit/instantsearch-client@latest " > </ script >
< script src =" https://cdn.jsdelivr.net/npm/instantsearch.js@4 " > </ script >
< script src =" https://cdn.jsdelivr.net/npm/searchkit@latest " > </ script >
Для Searchkit требуется Elasticsearch 7.0 или выше или Opensearch 2.4 или выше.
Ниже мы используем Docker для запуска Elasticsearch.
docker pull docker.elastic.co/elasticsearch/elasticsearch:8.6.2
docker network create elastic
docker run --name elasticsearch --net elastic -p 9200:9200 -p 9300:9300 -e " discovery.type=single-node " -e " xpack.security.enabled=false " -e http.cors.enabled=true -e " http.cors.allow-origin='*' " -e http.cors.allow-headers=X-Requested-With,X-Auth-Token,Content-Type,Content-Length,Authorization -e http.cors.allow-credentials=true -e network.publish_host=localhost -e xpack.security.enabled=false docker.elastic.co/elasticsearch/elasticsearch:8.6.2
затем давайте добавим индекс и некоторые данные
curl --location --request PUT ' http://localhost:9200/products '
--header ' Content-Type: application/json '
--data-raw ' {
"mappings": {
"properties": {
"name": {
"type": "text"
},
"description": {
"type": "text"
},
"price": {
"type": "integer"
},
"categories": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
} '
curl --location --request POST ' http://localhost:9200/products/_doc '
--header ' Content-Type: application/json '
--data-raw ' {
"name": "Apple iPhone 12 Pro Max",
"description": "The iPhone 12 Pro Max is the most powerful iPhone ever. It has a 6.7-inch Super Retina XDR display, a Ceramic Shield front cover, and a triple-camera system with a LiDAR scanner. It also has a 5G connection, a 6-core CPU, and a 4-core GPU. The iPhone 12 Pro Max is available in 128GB, 256GB, and 512GB storage options.",
"categories": ["phones", "apple"],
"price": 800
} '
curl --location --request POST ' http://localhost:9200/products/_doc '
--header ' Content-Type: application/json '
--data-raw ' {
"name": "Apple iPhone 12 Pro",
"description": "The iPhone 12 Pro is the most powerful iPhone ever. It has a 6.1-inch Super Retina XDR display, a Ceramic Shield front cover, and a triple-camera system with a LiDAR scanner. It also has a 5G connection, a 6-core CPU, and a 4-core GPU. The iPhone 12 Pro is available in 128GB, 256GB, and 512GB storage options.",
"categories": ["phones", "apple"],
"price": 700
} '
Searchkit совместим со всеми платформами Instantsearch. Ниже приведен пример использования реакции-мгновенного поиска.
import Searchkit from "searchkit"
import Client from '@searchkit/instantsearch-client'
// import your InstantSearch components
import { InstantSearch , SearchBox , Hits , RefinementList , Pagination , RangeInput } from 'react-instantsearch' ;
const sk = new Searchkit ( {
connection : {
host : 'http://localhost:9200' ,
// with an apiKey
// https://www.searchkit.co/docs/guides/setup-elasticsearch#connecting-with-api-key
// apiKey: '##########'
// with a username/password
// https://www.searchkit.co/docs/guides/setup-elasticsearch#connecting-with-usernamepassword
//auth: {
// username: "elastic",
// password: "changeme"
//}
} ,
search_settings : {
search_attributes : [ { field : 'title' , weight : 3 } , 'actors' , 'plot' ] ,
result_attributes : [ 'title' , 'actors' , 'poster' , 'plot' ] ,
highlight_attributes : [ 'title' ] ,
facet_attributes : [
{ attribute : 'actors' , field : 'actors.keyword' , type : 'string' } ,
{ attribute : 'imdbrating' , type : 'numeric' , field : 'imdbrating' }
]
}
} )
const searchClient = Client ( sk ) ;
const App = ( ) => (
< InstantSearch
indexName = "imdb_movies"
searchClient = { searchClient }
>
< SearchBox / >
< div className = "left-panel" >
< RefinementList attribute = "actors" searchable = { true } limit = { 10 } / >
< RangeInput attribute = "imdbrating" / >
< / div >
< div className = "right-panel" >
< Hits / >
< Pagination / >
< / div >
< / InstantSearch >
}
следуйте инструкциям руководства по началу работы.
Searchkit Node API позволяет пересылать запросы к Elasticsearch из браузера. Это полезно, если вы хотите скрыть Elasticsearch от браузера или добавить в запрос фильтры разрешений пользователей.
В Searchkit есть готовый построитель запросов, но вы также можете настроить запрос, передав функцию getQuery в apiClient.
const results = await apiClient . handleRequest ( req . body , {
getQuery : ( query , search_attributes ) => {
return [
{
combined_fields : {
query ,
fields : search_attributes ,
} ,
} ,
] ;
} ,
} ) ;
Searchkit поддерживает поиск по запросам KNN. Ниже приведен пример поиска по запросу KNN.
const results = await client . handleRequest ( req . body , {
getKnnQuery ( query , search_attributes , config ) {
return {
field : 'dense-vector-field' ,
k : 10 ,
num_candidates : 100 ,
// supported in latest version of Elasticsearch
query_vector_builder : {
text_embedding : {
model_id : 'cookie_model' ,
model_text : query
}
}
}
}
} ) ;
Следуйте инструкциям в руководстве по семантическому поиску.
Вы также можете переопределить весь запрос с помощью перехватчиков запросов. Ниже приведен пример перехватчика запроса, который добавляет запрос на повторную оценку к первому поисковому запросу.
Вы можете применить это в beforeSearch
и afterSearch
.
const results = await client . handleRequest ( req . body , {
hooks : {
beforeSearch : ( searchRequests ) => {
const uiRequest = searchRequests [ 0 ]
return [
{
... uiRequest ,
body : {
... uiRequest . body ,
rescore : {
window_size : 100 ,
query : {
rescore_query : {
match : {
plot : {
query : uiRequest . body . query ,
operator : "and" ,
} ,
} ,
} ,
query_weight : 1 ,
rescore_query_weight : 10 ,
}
}
}
} ,
searchRequests . slice ( 1 , searchRequests . length )
]
} ,
}
} ) ;
подробнее читайте в документации API здесь.
Правила запросов позволяют настраивать поведение поиска. Вы можете использовать правила запроса для повышения или фильтрации результатов или для изменения ранжирования результатов на основе набора условий.
Ниже приведен пример правила запроса, которое увеличивает результаты для фильмов с Дэном Эйкройдом или Чарли Шином и фильтрует результаты, чтобы показывать только фильмы, если в запросе есть слово «кино».
{
id : '1' ,
conditions : [
[
{
context : 'query' ,
value : 'movie' ,
match_type : 'exact'
}
]
] ,
actions : [
{
action : 'QueryBoost' ,
query : 'actors:"Dan Aykroyd" OR actors:"Charlie Sheen"' ,
weight : 2
} ,
{
action : 'QueryFilter' ,
query : 'type:"movie"'
}
]
}
дополнительную информацию можно найти в документации по правилам запросов.
Вопрос: Нужно ли мне предоставлять доступ к Elasticsearch общедоступному Интернету?
Searchkit передает запросы Elasticsearch.
Searchkit предлагает оба варианта: либо выполнять поиск непосредственно из браузера, либо использовать API Searchkit для прокси-запросов к Elasticsearch. Непосредственно из браузера вы получаете отличный опыт разработки и прототипирования. Когда вы будете готовы к развертыванию, вы можете использовать API Searchkit для прокси-запросов к Elasticsearch.
Вопрос: Нужно ли мне использовать React?
Вы можете использовать React, React Native, Vue, Angular. Вам даже не нужно использовать интерфейсную платформу, вы можете использовать простой Javascript и HTML с виджетами Instantsearch.js.
Вопрос: Какая версия Elasticsearch поддерживается?
Searchkit совместим с Elasticsearch 7.0 и выше + Opensearch 2.0 и выше.
Вопрос: Поддерживаете ли вы Android и iOS?
Потенциально. API Searchkit имитирует API Algolia, поэтому можно будет использовать клиент Algolia Instantsearch с API Searchkit с некоторыми изменениями. Если вы заинтересованы в этом, пожалуйста, дайте нам знать.
Вопрос: Почему мне следует использовать Searchkit вместо Algolia?
Elasticsearch имеет множество преимуществ перед Algolia. Возможно, вы захотите использовать Elasticsearch как более дешевую альтернативу Algolia, особенно если у вас большой набор данных. Возможно, вы захотите запустить Elasticsearch в своей собственной инфраструктуре или иметь больший контроль над релевантностью запросов.