我正在为我的音频商店建立一个搜索引擎。
我只对音频文档使用 1 个索引,结构如下:
{
id: { type: 'integer' },
title: { type: 'search_as_you_type' },
description: { type: 'text' },
createdAt: { type: 'date' },
updatedAt: { type: 'date' },
datePublished: { type: 'date' },
duration: { type: 'float' },
categories: {
type: 'nested',
properties: {
id: { type: 'integer' },
name: { type: 'text' }
},
}
}
按发布日期的顺序通过文本搜索音频文档很简单。但是我想通过基于特定范围内的音频收听时间和购买历史的趋势来进行文本搜索和排序,例如:过去 3 个月或过去 30 天的文本搜索趋势音频,所以我调整结构如下:
{
...previousProperties,
listenTimes: {
type: 'nested',
properties: {
timestamp: { type: 'date' },
progress: { type: 'float' }, // value 0-1.
},
},
purchaseHistories: {
type: 'nested',
properties: {
timestamp: { type: 'date' }
},
},
}
这是我获取过去 3 个月的热门音频的查询,它奏效了:
{
bool: {
should: [
{
nested: {
path: 'listenTimes',
query: {
function_score: {
query: {
range: {
'listenTimes.timestamp': {
gte: $range,
},
},
},
functions: [
{
field_value_factor: {
field: 'listenTimes.progress',
missing: 0,
},
},
],
boost_mode: 'replace',
},
},
score_mode: 'sum',
},
},
{
nested: {
path: 'purchaseHistories',
query: {
function_score: {
query: {
range: {
'purchaseHistories.timestamp': {
gte: 'now+1d-3M/d',
},
},
},
boost: 1.5,
},
},
score_mode: 'sum',
},
},
],
},
}
我对我的方法有一些不确定性,例如:
- 每个音频的收听次数和购买历史记录都很大,如果我这样构建数据是否有效?我只是用样本数据进行测试,它似乎工作正常。
- 每次我将收听时间和购买历史的新记录推送到音频文档时,Elasticsearch 是否会重新索引整个文档?
我是 Elasticsearch 的新手,所以有人可以就这个案例给我一些建议,非常感谢!