【发布时间】:2020-02-12 17:41:00
【问题描述】:
我正在构建一个带有 Angular 7 前端的 Rails 5 应用程序。 在这个应用程序中,我使用的是 Searchkick(一个 Elasticsearch gem),并且我已经索引了一个名为 Event 的模型,它具有属性 title(字符串)和 starts_at(日期时间)。
我希望能够在搜索控制器中构建一个查询,我可以在其中执行以下操作:
- 使用模糊搜索来搜索标题,这意味着它不必 100% 匹配(现在需要)。
- 在日期范围与 starts_at 匹配的情况下搜索索引事件。
这是我的控制器索引方法
def index
args = {}
args[:eventable_id] = params[:id]
args[:eventable_type] = params[:type]
args[:title] = params[:title] if params[:title].present?
if params[:starts_at].present?
args[:starts_at] = {}
args[:starts_at][:gte] = params[:starts_at].to_date.beginning_of_day
args[:starts_at][:lte] = params[:ends_at].to_date.end_of_day
end
@events = Event.search where: args, page: params[:page], per_page: params[:per_page]
end
我已将此行添加到我的事件模型中
searchkick text_middle: [:title]
这是实际运行的查询
{
"query": {
"bool": {
"must": {
"match_all": {}
},
"filter": [{
"term": {
"eventable_id": "2"
}
}, {
"term": {
"eventable_type": "Space"
}
}, {
"term": {
"title": "nice event"
}
}, {
"range": {
"starts_at": {
"from": "2020-02-01T00:00:00.000Z",
"include_lower": true,
"to": "2020-02-29T23:59:59.999Z",
"include_upper": true
}
}
}]
}
},
"timeout": "11s",
"_source": false,
"size": 10000
}
日期搜索不起作用(但我没有收到任何错误)并且标题搜索必须匹配 100%(即使是大小写)。
感谢大家的帮助!
【问题讨论】:
-
我建议使用 ngram,而不是使用模糊搜索。模糊搜索的问题在于,无论您设置什么偏移量,它都会将您正确匹配的术语视为等于不正确匹配的术语。所以“abc”匹配“abc”和“aac”,偏移量为1。对于范围查询,您需要一个带有
should或must子句的bool查询和您的实际范围字段查询{range: {year: {gte: params[:date], lte: params[:date], boost: 10}}}.我在 ES 7.3 中使用了类似的查询子句。 -
嗯,我明白了。我如何将它与上面的哈希一起使用来构建查询?
标签: ruby-on-rails elasticsearch searchkick