Searchkit هي مكتبة مفتوحة المصدر تساعدك على بناء تجربة بحث رائعة باستخدام Elasticsearch . يعمل مع Javascript وReact وVue وAngular والمزيد.
الموقع | العروض التوضيحية | التوثيق | الفتنة
يوفر Searchkit واجهة مستخدم بحث لـ Elasticsearch أو Opensearch. باستخدام Searchkit، يمكنك استخدام مكونات البحث الفوري مثل Searchbox ومرشحات التحسين والنتائج (وغيرها الكثير!) لبناء تجربة بحث.
يعد 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 متوافق مع جميع أطر البحث الفوري. يوجد أدناه مثال على استخدام البحث الفوري.
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 هنا.
تسمح لك قواعد الاستعلام بتخصيص سلوك تجربة البحث. يمكنك استخدام قواعد الاستعلام لتعزيز النتائج أو تصفيتها، أو لتغيير ترتيب النتائج، بناءً على مجموعة من الشروط.
يوجد أدناه مثال لقاعدة استعلام تعمل على تعزيز نتائج الأفلام التي شارك فيها Dan Aykroyd أو Charlie Sheen، وتقوم بتصفية النتائج لعرض الأفلام فقط إذا كان الاستعلام هو الكلمة "فيلم".
{
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 كلا الخيارين، إما إجراء البحث مباشرة من المتصفح، أو استخدام Searchkit API لتوكيل الطلبات إلى Elasticsearch. مباشرة من المتصفح يقدم تجربة مطور ونماذج أولية رائعة. بمجرد أن تصبح جاهزًا للنشر، يمكنك استخدام Searchkit API لتوكيل الطلبات إلى Elasticsearch.
س: هل أحتاج إلى استخدام React؟
يمكنك استخدام React وReact Native وVue وAngular. لا تحتاج حتى إلى استخدام إطار عمل الواجهة الأمامية، يمكنك استخدام Javascript وHTML العادي مع عناصر واجهة المستخدم Instantsearch.js.
س: ما هو إصدار Elasticsearch المدعوم؟
Searchkit متوافق مع Elasticsearch 7.0 وما فوق + Opensearch 2.0 وما فوق.
س: هل تدعم أندرويد و iOS؟
من المحتمل. تحاكي واجهة برمجة تطبيقات Searchkit واجهة برمجة تطبيقات Algolia، لذلك من الممكن استخدام عميل Algolia Instantsearch مع واجهة برمجة تطبيقات Searchkit مع بعض التعديلات. إذا كنت مهتما بهذا، يرجى اعلامنا.
س: لماذا أستخدم Searchkit بدلاً من Algolia؟
تتمتع Elasticsearch بالكثير من المزايا مقارنة بـ Algolia. قد ترغب في استخدام Elasticsearch كبديل أرخص لـ Algolia، خاصة إذا كان لديك مجموعة بيانات كبيرة. قد ترغب في تشغيل Elasticsearch على البنية الأساسية الخاصة بك، أو الحصول على تحكم أكبر في مدى صلة الاستعلام.