我在elastic-search
中有一个名为product的索引,具有字段ID,名称等。
我想按ID或名称搜索产品,但我的ID字段为整数,名称为文本,我尝试跟随但在按名称搜索时出错。
error type":"number_format_exception","reason":"For input string: \"test\""
def self.search_by_name_or_id(query)
__elasticsearch__.search({
query: {
bool: {
must:{
multi_match: {
query: query,
fields: ["id", "name"]
}
}
}
}
})
end
最佳答案
问题
很明显,您正在尝试在整数字段中搜索作为字符串的test
,而 flex 搜索无法将整数转换为test
,而不是test
,如果您搜索了10
或100
,那么elasticsearch会将其转换为整数,然后不会抛出异常。
解决方案
您正在尝试在这里混合两件事,但我不确定您的设计,但是如果您的id字段可以包含纯数字(即整数),则无法在单个查询中实现您的操作方式。
如果您可以将id字段转换为String,那么multi_match
查询将可以很好地工作,否则,您需要首先在您的应用程序中 checkin 该搜索词,可以将其转换为数字,也可以不将其转换为数字,即10
或100
可以正常工作,但是test10
或test100
不会,而且在id
字段中搜索这些术语毫无意义,因为它不会出现,因为它在ES中定义为整数,并且ES仅在索引期间拒绝包含这些术语的文档。 因此,根据您的应用程序代码检查,您可以构建ES查询,该查询可以在id
中包含或不包含multi-match
字段。
关于ruby-on-rails - 如何在一个查询中按ID和名称搜索产品数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57073113/