有人可以就以下问题提供建议吗?
我正在使用 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_fields
的 elasticsearch
功能。如果不是这样,您可以使用 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'}
}
}
}
}
使用 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/