gpt4 book ai didi

ruby-on-rails - 如何在Elasticsearch上设置日期和模糊标题搜索

转载 作者:行者123 更新时间:2023-12-03 02:30:10 25 4
gpt4 key购买 nike

我正在使用Angular 7前端构建Rails 5应用程序。
在这个应用程序中,我正在使用Searchkick(一个Elasticsearch的 gem ),并为一个名为Event的模型建立了索引,该模型具有属性title(字符串)和starts_at(日期时间)。

我希望能够在搜索 Controller 中建立查询,并能够执行以下操作:

  • 使用模糊搜索来搜索标题,这意味着它不必匹配100%(现在需要)。
  • 搜索日期范围与starts_at相匹配的事件。

  • 这是我的 Controller 索引方法
    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分析器,而不是使用模糊查询。

    这是一个ngram分析器的示例:

    analyzer: {
    ngram_analyzer: {
    type: "custom",
    tokenizer: "standard",
    filter: ["lowercase", "ngram_filter"],
    char_filter: [
    "replace_dots"
    ]
    }
    },
    filter: {
    ngram_filter: {
    type: "ngram",
    min_gram: "3",
    max_gram: "20",
    }
    }

    您还必须将此代码添加到设置索引中:
     max_ngram_diff: 17

    然后在您的映射上,确保创建两个字段。为您的常规字段(例如 name)映射1个,然后为您的ngram字段(例如 name.ngram)映射另一个。

    在查询中,我想给 name字段增加10,给 name.ngram字段增加5,以便首先显示完全匹配。不过,您将不得不玩这个游戏。

    关于范围查询,我正在使用 gtelte。这是一个例子:
    query:{
    bool: {
    must: {
    range: {date: {gte: params[:date], lte: params[:date], boost: 10}}
    }
    }
    }

    我希望这有帮助。

    关于ruby-on-rails - 如何在Elasticsearch上设置日期和模糊标题搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60194179/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com