ruby-on-rails - 如何在一个查询中按ID和名称搜索产品数据

标签 ruby-on-rails elasticsearch

我在elastic-search中有一个名为product的索引,具有字段ID,名称等。
我想按ID或名称搜索产品,但我的ID字段为整数,名称为文本,我尝试跟随但在按名称搜索时出错。

error type":"number_format_exception","reason":"For input string: \"test\""



  def self.search_by_name_or_id(query)
    __elasticsearch__.search({
      query: {
        bool: {
          must:{
            multi_match: {
              query: query,
              fields: ["id", "name"]
            }
          }
        }
      }
    })
  end

最佳答案

问题

很明显,您正在尝试在整数字段中搜索作为字符串的test,而 flex 搜索无法将整数转换为test,而不是test,如果您搜索了10100,那么elasticsearch会将其转换为整数,然后不会抛出异常。

解决方案
您正在尝试在这里混合两件事,但我不确定您的设计,但是如果您的id字段可以包含纯数字(即整数),则无法在单个查询中实现您的操作方式。

如果您可以将id字段转换为String,那么multi_match查询将可以很好地工作,否则,您需要首先在您的应用程序中 checkin 该搜索词,可以将其转换为数字,也可以不将其转换为数字,即10100可以正常工作,但是test10test100不会,而且在id字段中搜索这些术语毫无意义,因为它不会出现,因为它在ES中定义为整数,并且ES仅在索引期间拒绝包含这些术语的文档。 因此,根据您的应用程序代码检查,您可以构建ES查询,该查询可以在id中包含或不包含multi-match字段。

关于ruby-on-rails - 如何在一个查询中按ID和名称搜索产品数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57073113/

相关文章:

ruby-on-rails - Rails WebSocket 客户端永远不会触发 OnOpen

ruby-on-rails - 为什么运行 rake db :migrate? 时未(正确)生成 schema.rb

sql - 如何使用 ActiveRecord 和 Postgresql 按列选择唯一记录

ruby-on-rails - Ruby 1.9.2 中的 Process.fork 和 Process.spawn 有什么区别

elasticsearch - 将时间戳转换为日期以进行过滤

ruby-on-rails - 如何从Rails的elasticsearch中删除不存在的文档?

indexing - 根据数组类型字段的大小对 ElasticSearch 进行排序

Excel 到 ElasticSearch API 请求

python - ElasticSearch 匹配查询得分

ruby-on-rails - actionmailer基于.LTD app.com/app.fr设置主机动态