dra*_*rac 5 elasticsearch ruby-on-rails-4 searchkick
谁能在以下方面提供建议?
我正在使用searchkick / elasticsearch,想在多个字段(名称,制造商)中搜索一个或多个关键术语。因此,例如,如果我正在寻找一个名为“ myproduct”的产品使我的“ somemanufacturer”成为可能,那么如果我搜索“ myproduct”,“ somemanufacturer”或“ myproduct somemanufacturer”,我希望看到此结果出现,因为这两个术语都包括在内在名称或制造商字段中。
我的问题如下:
@products = Product.search query
Run Code Online (Sandbox Code Playgroud)
允许上面列出的所有搜索词并在我添加后立即返回预期结果
@products = Product.search query, fields: [:name, :manufacturer_name]
Run Code Online (Sandbox Code Playgroud)
它只会返回“ myproduct”或“ somecompany”的结果,而不返回“ myproduct somecompany”的结果。
现在这没什么大不了的,因为我可以完全删除fields选项,但是我需要利用searchkicks word_start作为name字段。所以我的最终查询是这样的:
@products = Product.search query, fields: [{name: :word_start}, :manufacturer_name]
Run Code Online (Sandbox Code Playgroud)
我希望用户搜索产品的第一个字符串,也能够输入制造商,例如“ myprod somecompany”,不幸的是,当我希望它将返回某公司制造的名为myproduct的产品时,此方法返回零结果。
我在这里真的缺少明显的东西吗?我可以更改添加
operator: 'or'
Run Code Online (Sandbox Code Playgroud)
但实际上,我希望能够对名称进行部分搜索,添加其他术语,并且如果同时存在于特定记录中,则会返回该术语。
这也是我的模型代码
class Product < ActiveRecord::Base
searchkick word_start: [:name]
end
Run Code Online (Sandbox Code Playgroud)
谢谢
如果您的所有字段共享同一分析仪,则可以使用elasticsearch称为的功能cross_fields。如果不是这种情况,可以使用query_string。遗憾的是searchkick不支持cross_fields和query_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'}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
使用cross_fields搜索
@products = Product.search(body: {
query: {
multi_match: {
query: query,
type: "cross_fields",
operator: "and",
fields: [
"name",
"manufacturer_name",
"grouped",
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
用query_string搜索
@products = Product.search(body: {
query: {
query_string: {
query: query,
default_operator: "AND",
fields: [
"name",
"manufacturer_name",
"grouped",
]
}
}
}
Run Code Online (Sandbox Code Playgroud)
更新 -在此解决方案之后,更改了我对使用不同分析仪和多个字段的回答。
不幸的是,将查询传递给elasticsearch自己会丢失searchkick诸如突出显示和转换之类的功能,但是您仍然可以将其添加到elasticsearch查询中。
向查询添加亮点
@products = Product.search(body: {
query: {
...
}, highlight: {
fields: {
name: {},
manufacturer_name: {}
}
}
Run Code Online (Sandbox Code Playgroud)
向查询添加转化
@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'
}
}
}
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2366 次 |
| 最近记录: |