ruby-on-rails-4 - Searchkick 在指定字段时不搜索多个术语

标签 ruby-on-rails-4 elasticsearch searchkick

有人可以就以下问题提供建议吗?

我正在使用 searchkick/elasticsearch 并想在多个字段(名称、制造商)中搜索一个或多个关键术语。因此,例如,如果我正在寻找名为“myproduct”的产品使我成为“somemanufacturer”,我希望在搜索“myproduct”、“somemanufacturer”或“myproduct somemanufacturer”时看到此结果,因为这两个术语都包含在名称或制造商字段中。

我的问题如下:

@products = Product.search query

允许上面列出的所有搜索词并在我添加后立即返回预期结果

@products = Product.search query, fields: [:name, :manufacturer_name]

它只会返回“myproduct”或“somecompany”的结果,而不会返回“myproduct somecompany”的结果。

现在这没什么大不了的,因为我可以完全删除字段选项,但我需要为名称字段使用 searchkicks word_start。所以我的最终查询是这样的:

@products = Product.search query, fields: [{name: :word_start}, :manufacturer_name]

我希望用户搜索产品的第一个字符串并能够输入制造商,例如“myprod somecompany”不幸的是,当我希望它返回名为 myproduct 的产品时,它返回零结果,由 somecompany 制造.

我在这里遗漏了一些非常明显的东西吗?我可以更改添加<​​/p>

operator: 'or'

但我真的希望能够对名称进行部分搜索,添加其他术语,如果特定记录同时存在这两个术语,它就会被返回。

这也是我的模型代码

class Product < ActiveRecord::Base
 searchkick word_start: [:name]
end

谢谢

最佳答案

如果您的所有字段共享同一个分析器,您可以使用名为 cross_fieldselasticsearch 功能。如果不是这样,您可以使用 query_string。不幸的是 searchkick 还不支持 cross_fieldsquery_string。所以,你必须自己做。

索引(不同分析器)

searchkick merge_mappings: true, mappings: {
  product: {
    properties: {
      name: {
        type: 'string',
        analyzer: 'searchkick_word_start_index',
        copy_to: 'grouped'
      },
      manufacturer_name: {
        type: 'string',
        analyzer: 'default_index',
        copy_to: 'grouped'
      },
      grouped: {
        raw: {type: 'string', index: 'not_analyzed'}
      }
    }
  }
}

使用 cross_fields 搜索

@products = Product.search(body: {
  query: {
     multi_match: {
                  query: query,
                  type: "cross_fields",
                  operator: "and",
                  fields: [
                      "name",
                      "manufacturer_name",
                      "grouped",
                  ]
              }
         }
}

使用 query_string 搜索

@products = Product.search(body: {
  query: {
      query_string: {
                  query: query,
                  default_operator: "AND",
                  fields: [
                      "name",
                      "manufacturer_name",
                      "grouped",
                  ]
              }
         }
}

更新 - 在这个 solution 之后将我的答案更改为使用不同的分析器和多字段.

不幸的是,你自己将查询传递给 elasticsearch,你失去了 searchkick 功能,如突出显示和转换,但是,你仍然可以这样做,将它添加到 elasticsearch 查询。

为查询添加高亮显示

@products = Product.search(body: {
  query: {
    ...
  }, highlight: {
    fields: {
      name: {},
      manufacturer_name: {}
    }
  }

向查询添加转化

@products = Product.search(body: {
  query: {
    bool: {
      must: {
        dis_max: {
          queries: {
            query_string: {
              ...
            }
          }
        }
      },
      should: {
        nested: {
          path: 'conversions',
          score_mode: 'sum',
          query: {
            function_score: {
              boost_mode: 'replace',
              query: {
                match: {
                  "conversions.query": query
                }
              },
              field_value_factor: {
                field: 'conversions.count'
              }
            }
          }
        }
      }
    }
  }

关于ruby-on-rails-4 - Searchkick 在指定字段时不搜索多个术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32743635/

相关文章:

ruby-on-rails-4 - Ruby on Rails:.html_safe和sanitize()之间的区别

elasticsearch - elasticsearch同义词无法正常工作

ruby-on-rails - FORBIDDEN/12/index read-only/allow delete (api) 问题

ruby-on-rails - rails 4 : Why does this code not save Contact and Company to database?

ruby-on-rails - 为什么 Active Record 在内部使用 module_eval 来实现某些功能?

node.js - ElasticSearch重启花费很长时间

elasticsearch - 为什么ElasticSearch对于dat_histogram聚合仅返回5个存储桶?

ruby-on-rails - 使用 Ruby Searchkick 的多个搜索词

java - Elasticsearch 日志文件过大导致性能下降

ruby-on-rails - 如何在 Rails 中创建具有 NULLS LAST 的索引?