Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 4 指定字段时Searchkick不搜索多个术语_Ruby On Rails 4_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Searchkick - Fatal编程技术网 elasticsearch,searchkick,Ruby On Rails 4,elasticsearch,Searchkick" /> elasticsearch,searchkick,Ruby On Rails 4,elasticsearch,Searchkick" />

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

Ruby on rails 4 指定字段时Searchkick不搜索多个术语,ruby-on-rails-4,elasticsearch,searchkick,Ruby On Rails 4,elasticsearch,Searchkick,有人能提供以下方面的建议吗 我正在使用searchkick/elasticsearch,希望在多个字段(名称、制造商)中搜索一个或多个关键术语。因此,例如,如果我正在寻找一个名为“myproduct”的产品,使我的“somemanufacturer”成为我的“somemanufacturer”,我希望在搜索“myproduct”、“somemanufacturer”或“myproduct somemanufacturer”时看到这个结果,因为这两个术语都包含在名称或制造商字段中 我的问题如下:

有人能提供以下方面的建议吗

我正在使用searchkick/elasticsearch,希望在多个字段(名称、制造商)中搜索一个或多个关键术语。因此,例如,如果我正在寻找一个名为“myproduct”的产品,使我的“somemanufacturer”成为我的“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制造

我是不是错过了一些很明显的东西?我可以更改添加

operator: 'or'
但我真的希望能够在名称上进行部分搜索,添加额外的术语,如果这两个术语都存在于特定的记录中,则返回它们

这是我的模型代码

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

谢谢

如果您的所有字段共享同一个分析器,您可以使用名为
交叉字段的
elasticsearch
功能。如果不是这样,您可以使用
query\u string
。不幸的是,
searchkick
还不支持
cross\u字段
query\u字符串
。所以,你必须自己做

索引(不同的分析器)

使用交叉字段进行搜索

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'}
      }
    }
  }
}
@products = Product.search(body: {
  query: {
     multi_match: {
                  query: query,
                  type: "cross_fields",
                  operator: "and",
                  fields: [
                      "name",
                      "manufacturer_name",
                      "grouped",
                  ]
              }
         }
}
使用查询字符串进行搜索

@products = Product.search(body: {
  query: {
      query_string: {
                  query: query,
                  default_operator: "AND",
                  fields: [
                      "name",
                      "manufacturer_name",
                      "grouped",
                  ]
              }
         }
}
更新 -在此之后,我将答案更改为使用不同的分析器和多字段

不幸的是,自己将查询传递到
elasticsearch
会丢失
searchkick
突出显示和转换等功能,但您仍然可以这样做,将其添加到
elasticsearch
查询中

向查询添加hightlight

@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'
              }
            }
          }
        }
      }
    }
  }
向查询添加转换

@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'
              }
            }
          }
        }
      }
    }
  }

最简单的方法是使用
search\u data
方法将字段合并为一个字段

class Product
  def search_data
    {
      full_name: "#{manufacturer_name} #{name}"
    }
  end
end

之后一定要重新编制索引。然后使用全名进行搜索。Searchkick的所有功能都将继续发挥作用。

我遇到了同样的问题,你解决了吗?解决了,作为答案发布。你从哪里获得了“Searchkick单词开始索引”和“默认索引”???