运行Docker容器
docker run -it \
--rm \
-e MEILI_NO_ANALYTICS=true \
-e MEILI_ENV=production \
-e MEILI_MASTER_KEY=[长度大于16位的密钥] \
-v $(pwd)/meili_data:/meili_data \
-p 7701:7700 \
getmeili/meilisearch:v1.12
MEILI_NO_ANALYTICS
meilisearch默认进行数据收集,要主动关闭MEILI_ENV
production或者developmentMEILI_MASTER_KEY
development环境可以不设置,production环境必须设置长度大于16位的密钥
docker-compose启动
services:
meilisearch:
container_name: meilisearch
image: getmeili/meilisearch:v1.12
restart: always
volumes:
- $PWD/data:/meili_data
environment:
- MEILI_NO_ANALYTICS=true
- MEILI_ENV=production
- MEILI_MASTER_KEY=[长度大于16位的密钥]
ports:
- "7701:7700"
索引(index)
可以理解为数据库中的表(table)
创建索引
client.createIndex('movies', { primaryKey: 'id' })
获取索引
client.getIndexes()
更新索引
client.updateIndex("article",{primaryKey:"id"})
删除索引
client.deleteIndex("article")
文档(Documents)
可以理解为表中的一条记录
添加或替换文档
client.index('movies').addDocuments([{
id: 287947,
title: 'Shazam',
poster: 'https://image.tmdb.org/t/p/w1280/xnopI5Xtky18MPhK40cZAGAOVeV.jpg',
overview: 'A boy is given the ability to become an adult superhero in times of need with a single magic word.',
release_date: '2019-03-23'
}])
删除文档
// 删除一个文档
client
.index('movies')
.getDocument(25684, { fields: ['id', 'title', 'poster', 'release_date'] })
Click to copyClick to copy
// 删除全部文档
client.index('movies').deleteAllDocuments()
获取文档
client.index('movies').getDocuments({
limit: 2,
filter: 'genres = action'
})
搜索
Facets
想象你在电商网站搜索"手机",左侧会有一些筛选条件,比如:
品牌: Apple (10个) Samsung (8个) Huawei (5个)
价格区间: 1000-2000元 (5个) 2000-3000元 (8个) 3000元以上 (10个)
颜色: 黑色 (12个) 白色 (8个) 金色 (3个)
这就是 Facets(分面搜索),它让用户可以通过多个维度来筛选搜索结果。 具体使用方法:
首先告诉 Meilisearch 哪些字段可以用来筛选:
await index.updateSettings({
filterableAttributes: ['brand', 'price', 'color']
})
搜索时获取这些筛选项的统计信息:
const results = await index.search('手机', {
facets: ['brand', 'price', 'color']
})
搜索结果会包含每个筛选项的统计:
{
hits: [...], // 搜索结果
facetDistribution: {
brand: {
"Apple": 10, // Apple品牌有10个商品
"Samsung": 8, // Samsung品牌有8个商品
"Huawei": 5 // Huawei品牌有5个商品
},
color: {
"黑色": 12,
"白色": 8,
"金色": 3
}
}
}
用户选择筛选条件时,使用 filter 参数:
// 搜索黑色的苹果手机
const results = await index.search('手机', {
facets: ['brand', 'color'],
filter: 'brand = Apple AND color = 黑色'
})
现在明白了吗?Facets 就是帮助用户更精确地找到他们想要的内容的一种筛选机制。
Facts 是 Meilisearch 中的一个功能,它允许我们存储一些需要精确匹配的属性值。与常规的属性不同,facts 不会被分词或进行模糊匹配,而是用于精确过滤和聚合。
Attributes
指定要搜索的属性,默认["*"]
搜索全部属性
client.index('movies').search('adventure', {
attributesToSearchOn: ['overview']
})
指定返回结果中包含哪些属性,默认["*"]
,返回全部属性
client.index('movies').search('shifu', {
attributesToRetrieve: ['overview', 'title']
})
高亮
When this parameter is set, returned documents include a _formatted object containing the highlighted terms.
client.index('movies').search('winter feast', {
attributesToHighlight: ['overview'],
highlightPreTag: '<span class="highlight">',
highlightPostTag: '</span>'
})
排序
client.index('books').search('science fiction', {
sort: ['price:asc'],
})
匹配策略
Meilisearch 提供了三种主要的匹配策略:last、all 和 frequency。Default value: last
last 策略(默认)
await index.updateSettings({
matchingStrategy: 'last'
})
特点:只匹配查询词中的最后一个词,其他词必须完全匹配,适用于输入补全场景
示例:
// 假设搜索 "iphone pro m"
// 只对 "m" 进行前缀搜索
// "iphone" 和 "pro" 需要完全匹配
// 可能匹配:"iPhone Pro Max", "iPhone Pro Mini"
all 策略
await index.updateSettings({
matchingStrategy: 'all'
})
特点:对所有查询词都进行前缀匹配,更宽松的匹配规则,返回更多的结果
示例:
// 搜索 "iph pro m"
// 可能匹配:
// "iPhone Pro Max"
// "iPod Professional Management"
// "iPad Profile Monitor"
frequency 策略
await index.updateSettings({
matchingStrategy: 'frequency'
})
特点:基于词频进行匹配,常见词需要完全匹配,罕见词可以进行前缀匹配
示例:
// 假设搜索 "the iph"
// "the" 是常见词,需要完全匹配
// "iph" 是罕见词,可以前缀匹配
// 可能匹配:"The iPhone", "The iPad"