当前位置: 首页 > 面试题库 >

Elasticsearch如何使用通配符进行OR查询

岑畅
2023-03-14
问题内容

我很难用Elasticsearch构建查询。

我想查询类似的东西:

WHERE field_1 is 'match' $string OR field_2 is 'wildcard_match' $string OR field_3 is 'fuzzy' $string

所以我试图构造的是这样的:

{
    "bool" : {
        "should" : [
            {
                "match" : { "field_1" : "testing" }
            },
            {
                "wildcard" : { "field_2" : "*testing*" }
            },
            {
                "fuzzy" : { "field_3" : "testing" }
            }
        ],
        "minimum_should_match" : 1,
    }
}

但这似乎返回一个错误。

谁能给我一个指针,我应该如何看待用Elasticsearch进行这种OR查询?

我当前的数据已发送:

{
  "_index": "twitter",
  "_type": "tweet",
  "_id": "1",
  "_version": 1,
  "found": true,
  "_source": {
    "field_1": "some data",
    "field_2": "testing data",
    "field_3": "other things"
  }
}

和我的查询:

curl -XGET  'http://localhost:9200/twitter/tweet/_search' -d '
"query" : {
    "bool" : {
        "should" : [
            {
                "match" : { "field_1" : "testing" }
            },
            {
                "wildcard" : { "field_2" : "*testing*" }
            },
            {
                "fuzzy" : { "field_3" : "testing" }
            }
        ],
        "minimum_should_match" : 1,
    }
}'

返回此错误:

SearchPhaseExecutionException[Failed to execute phase [query], all shards failed;
  shardFailures {[ZmwpcILwSEyufHf-t9xQ6g][twitter][0]:
  SearchParseException[[twitter][0]: from[-1],size[-1]:
    Parse Failure [Failed to parse source [
      {
        "query": {
          "bool": {
            "should": [
              {
                "match": {
                  "field_1": "testing"
                }
              },
              {
                "wildcard": {
                  "field_2": "*testing*"
                }
              },
              {
                "fuzzy": {
                  "field_3": "testing"
                }
              }
            ],
            "minimum_should_match": 1,
          }
        }
      }
    ]]]; 
  nested: ElasticsearchParseException[Expected START_OBJECT but got VALUE_STRING null]; }{[ZmwpcILwSEyufHf-t9xQ6g][twitter][1]: 
  SearchParseException[[twitter][1]: from[-1],size[-1]:
    Parse Failure [Failed to parse source [
      {
        "query": {
          "bool": {
            "should": [
              {
                "match": {
                  "field_1": "testing"
                }
              },
              {
                "wildcard": {
                  "field_2": "*testing*"
                }
              },
              {
                "fuzzy": {
                  "field_3": "testing"
                }
              }
            ],
            "minimum_should_match": 1,
          }
        }
      }
    ]]]; 
  nested: ElasticsearchParseException[Expected START_OBJECT but got VALUE_STRING null]; }{[ZmwpcILwSEyufHf-t9xQ6g][twitter][2]: 
  SearchParseException[[twitter][2]: from[-1],size[-1]: Parse Failure [Failed to parse source [
    {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "field_1": "testing"
              }
            },
            {
              "wildcard": {
                "field_2": "*testing*"
              }
            },
            {
              "fuzzy": {
                "field_3": "testing"
              }
            }
          ],
          "minimum_should_match": 1,
        }
      }
    }
  ]]]; 
  nested: ElasticsearchParseException[Expected START_OBJECT but got VALUE_STRING null]; }{[ZmwpcILwSEyufHf-t9xQ6g][twitter][3]: 
  SearchParseException[[twitter][3]: from[-1],size[-1]: Parse Failure [Failed to parse source [
    {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "field_1": "testing"
              }
            },
            {
              "wildcard": {
                "field_2": "*testing*"
              }
            },
            {
              "fuzzy": {
                "field_3": "testing"
              }
            }
          ],
          "minimum_should_match": 1,
        }
      }
    }
  ]]]; 
  nested: ElasticsearchParseException[Expected START_OBJECT but got VALUE_STRING null]; }{[ZmwpcILwSEyufHf-t9xQ6g][twitter][4]: 
  SearchParseException[[twitter][4]: from[-1],size[-1]: Parse Failure [Failed to parse source [
    {
      "query": {
        "bool": {
          "should": [
            {
              "match": {
                "field_1": "testing"
              }
            },
            {
              "wildcard": {
                "field_2": "*testing*"
              }
            },
            {
              "fuzzy": {
                "field_3": "testing"
              }
            }
          ],
          "minimum_should_match": 1,
        }
      }
    }
  ]]]; nested: ElasticsearchParseException[Expected START_OBJECT but got VALUE_STRING null]; }]

问题答案:

这是由于JSON格式错误所致。此查询的正确JSON格式如下-

{   // --->> This was missing
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "field_1": "testing"
          }
        },
        {
          "wildcard": {
            "field_2": "*testing*"
          }
        },
        {
          "fuzzy": {
            "field_3": "testing"
          }
        }
      ],
      "minimum_should_match": 1
    }
  }
}   // --->> This was missing


 类似资料:
  • 该字段中的映射是: 所以,我想我误解了通配符在ES中是如何工作的。有人知道为什么不匹配文本字段中的“任何字符”吗? 谢了。 > 创建索引

  • 问题内容: 我有一个名为“ acts”的表,该表具有3个被索引在一起的列: 在表格中,一行有一个名为“红色暴动”的行为 当我执行以下搜索时,结果中会出现红色暴动: 但是,如果我对此进行扩展并搜索,则不会返回任何结果: 这是为什么?有没有更好的方法在查询中使用通配符? 我尝试更改为,但这在任一查询上均未返回任何结果。 问题答案: 值“ re”是MATCH()搜索的停用词。 http://dev.my

  • 我在努力实现这个目标: 通过bool查询筛选出结果,如“status=1” 通过布尔范围查询筛选出结果,如“discance:gte 10和lte 60” 通过从int数组中匹配至少一个int值筛选出结果 在多个字段中搜索单词,并计算文档得分。有些字段需要通配符,有些字段需要增强,如ImportantField^2、SomeField*、SomeOtherField^0.75 以上所有点都由AND

  • 问题内容: 我有一个具有属性名称和姓氏的用户对象。我想使用一个查询来搜索这些字段,并且在文档中找到了该字段,但是我不知道如何将其与通配符一起正确使用。可能吗? 我尝试了查询,但没有成功: 问题答案: 或者,您可以对通配符使用查询。 这将比在索引时使用nGram过滤器慢(请参阅我的其他答案),但是如果您正在寻找一种快速且肮脏的解决方案… 我也不确定您的映射,但是如果您使用而不是映射,则需要如下所示:

  • 本文向大家介绍Java如何使用elasticsearch进行模糊查询,包括了Java如何使用elasticsearch进行模糊查询的使用技巧和注意事项,需要的朋友参考一下 这篇文章主要介绍了Java如何使用elasticsearch进行模糊查询,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 使用环境上篇文章本人已书写过,需要maven坐标,ES连

  • 问题内容: 我正在尝试使用 Java 和 Elasticsearch 进行Elasticsearch搜索。elasticsearch为Java提供了API,这很酷。 问题是,我希望在Java中创建一个方法,该方法接收一个字符串(应该是一个包含用于搜索的信息的JSON),该字符串反映此对Elasticsearch的HTTP调用 但是我希望这种方法尽可能通用。 所以问题是: 是否可以使用Java AP