IP地址检测
视频播放器
输入关键词搜索
登录
Melisearch教程

Melisearch教程

2025-01-22
编程开发

运行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或者development
  • MEILI_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"
THE END
0/500
暂无评论
📢网站公告
欢迎来到这里
⚙️实用工具
html转pdfmarkdown编辑器
本站推荐:腾讯云服务器仅需2.3折 (点击直达)
用户协议
隐私政策
Build Time: 2025-02-06 16:15:33