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