我的查询非常简单,为了使其更简单,可以说我只搜索两个字段,即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
}
}
}
答案 0 :(得分:1)
没有您的文档或映射的详细信息,我的第一个猜测是age
字段被Elasticsearch解释为数字字段。传递除“数字”类型以外的任何内容或可以转换为数字的内容都会导致查询失败,但有些例外会报告将字符串转换为数字失败。
话虽如此,您可以尝试在lenient: true
搜索词中添加match_phrase_prefix
,这将使Elasticsearch忽略将转换为数字类型的失败,并从搜索中删除该词。 / p>
另一种方法是仅允许用户在相同类型的多个字段上进行查询,或指定他们希望在哪个字段中查询哪些数据。即我是用户,我想搜索age
为23并拥有name
John的用户,而不是输入23 John
或类似名称。
否则,您可能需要预处理查询字符串,并使用lenient: true
分别拆分搜索词并将其传递到搜索子句中,以尝试在具有不同数据类型的多个字段中搜索多个词。
您还可以尝试使用其他搜索类型,例如multi_match
,query_string
或simple_query_string
,因为这些搜索类型可能会为您要执行的操作提供更大的灵活性。>