如何对两种不同的数据类型执行搜索查询?
How to perform search query on two different data types?
我的查询非常简单,为了让它更简单,假设我只搜索两个字段,name(text) & age(long):
GET person_db/person/_search
{
"query": {
"bool": {
"should": [
{
"match_phrase_prefix": {
"name": "hank"
}
},
{
"match_phrase_prefix": {
"age": "hank"
}
}
],
"minimum_should_match": 1,
"boost": 1.0
}
}
}
如果我搜索“23”,没问题,elastic 知道如何将其更改为数字并且不会失败,但如果搜索输入是 "john",我会收到错误 400 "reason": "failed to create query: {\n \"bool\...."
.
遇到这种情况我该怎么办?
我想过在插入es之前把数值型的值改成字符串,但是尽量避免,我觉得es应该有办法支持。
欣赏
此查询有效:(感谢@jmlw)
{
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": "alt",
"type": "phrase_prefix",
"fields": [
"name",
"taxid",
"providers.providerAddress.street"
],
"lenient": true
}
}
],
"minimum_should_match": 1,
"boost": 1.0
}
}
}
没有您的文档或映射的详细信息,我的第一个猜测是 age
字段被 Elasticsearch 解释为数字字段。传入除 'number' 类型以外的任何其他类型,或可以转换为数字的内容将导致查询失败,某些异常报告无法将您的字符串转换为数字。
话虽如此,您可以尝试将 lenient: true
添加到您的 match_phrase_prefix
搜索词中,这将允许 Elasticsearch 忽略转换为数字类型的失败,并从搜索中删除该词.
另一种方法是只允许用户查询同一类型的多个字段,或者指定他们想在哪个字段中查询什么数据。 IE。我是一名用户,我想搜索 age
为 23 且有 name
John 的人,而不是输入 23 John
或类似内容。
否则,您可能需要预处理查询字符串,拆分搜索词并将它们单独传递到搜索子句中 lenient: true
以尝试在具有不同数据类型的多个字段中搜索多个词。
您也可以尝试使用不同的搜索类型,例如 multi_match
、query_string
或 simple_query_string
,因为它们可能会更灵活地满足您的需求。
我的查询非常简单,为了让它更简单,假设我只搜索两个字段,name(text) & age(long):
GET person_db/person/_search
{
"query": {
"bool": {
"should": [
{
"match_phrase_prefix": {
"name": "hank"
}
},
{
"match_phrase_prefix": {
"age": "hank"
}
}
],
"minimum_should_match": 1,
"boost": 1.0
}
}
}
如果我搜索“23”,没问题,elastic 知道如何将其更改为数字并且不会失败,但如果搜索输入是 "john",我会收到错误 400 "reason": "failed to create query: {\n \"bool\...."
.
遇到这种情况我该怎么办?
我想过在插入es之前把数值型的值改成字符串,但是尽量避免,我觉得es应该有办法支持。
欣赏
此查询有效:(感谢@jmlw)
{
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": "alt",
"type": "phrase_prefix",
"fields": [
"name",
"taxid",
"providers.providerAddress.street"
],
"lenient": true
}
}
],
"minimum_should_match": 1,
"boost": 1.0
}
}
}
没有您的文档或映射的详细信息,我的第一个猜测是 age
字段被 Elasticsearch 解释为数字字段。传入除 'number' 类型以外的任何其他类型,或可以转换为数字的内容将导致查询失败,某些异常报告无法将您的字符串转换为数字。
话虽如此,您可以尝试将 lenient: true
添加到您的 match_phrase_prefix
搜索词中,这将允许 Elasticsearch 忽略转换为数字类型的失败,并从搜索中删除该词.
另一种方法是只允许用户查询同一类型的多个字段,或者指定他们想在哪个字段中查询什么数据。 IE。我是一名用户,我想搜索 age
为 23 且有 name
John 的人,而不是输入 23 John
或类似内容。
否则,您可能需要预处理查询字符串,拆分搜索词并将它们单独传递到搜索子句中 lenient: true
以尝试在具有不同数据类型的多个字段中搜索多个词。
您也可以尝试使用不同的搜索类型,例如 multi_match
、query_string
或 simple_query_string
,因为它们可能会更灵活地满足您的需求。