当前位置: 首页 > 知识库问答 >
问题:

如何使用通配符查询ElasticSearch

林雅畅
2023-03-14
message:org.jooq.exception.TooManyRowsException
message:*TooManyRowsException

该字段中的映射是:

"messages": {
  "match": "*message",
  "match_mapping_type":"string",
  "mapping": {
    "type":"text",
    "analyzer":"custom_standard"
  }
}

所以,我想我误解了通配符在ES中是如何工作的。有人知道为什么*不匹配文本字段中的“任何字符”吗?

谢了。

message:*.TooManyRowsException
message:"*TooManyRowsException"
message:(*TooManyRowsException)
message:TooManyRowsException

>

  • 创建索引

    curl -H 'Content-Type: application/json' -XPUT localhost:9200/twitter
    {
        "settings": {
            "analysis": {
                "analyzer": {
                    "custom_standard": {
                        "type": "custom",
                        "tokenizer": "uax_url_email",
                        "filter": ["lowercase", "snowball", "stop"]
                    }
                },
                "normalizer": {
                    "custom_lowercase": {
                        "type": "custom",
                        "filter": ["lowercase"]
                    }
                }
            }
        },
        "mappings": {
            "dynamic_templates": [
                {
                    "messages": {
                        "match": "*message",
                        "match_mapping_type":"string",
                        "mapping": {
                            "type":"text",
                            "analyzer":"custom_standard"
                        }
                    }
                }
            ]
        }
    }
    curl -s -H 'Content-Type: application/json' -XPOST localhost:9200/twitter/_doc
    {
       "message": "org.jooq.exception.TooManyRowsException"
    }
    curl -s -H 'Content-Type: application/json' -XGET localhost:9200/twitter/_search
    {
        "query": {
            "query_string": {
                "query": "message:org.jooq.exception.TooManyRowsException"
            }
        }
    }
    curl -s -H 'Content-Type: application/json' -XGET localhost:9200/twitter/_search
    {
        "query": {
            "query_string": {
                "query": "message:*TooManyRowsException"
            }
        }
    }
  • 共有1个答案

    韩羽
    2023-03-14

    忽略此,请参见编辑2

    我想你确实误解了通配符是如何工作的。你能偶然发布你的完整映射吗?我知道您使用的是动态映射,但是动态映射用于根据条件设置字段的类型,与搜索行为无关。例如,映射将采用名称以message结尾的所有字符串字段,并将其映射为文本字段。

    这是否是您想要的还很难说,但是如果您这样做是为了允许通配符搜索,那么您可能不需要这些。

    要执行通配符搜索,实际上只需要在查询字符串的适当位置使用*

    {
        "query": {
            "query_string": {
                "query": "*.TooManyRowsException",
                "default_field" : "message",
                "allow_leading_wildcard": true
            }
        }
    }
    

    {
        "query": {
            "query_string": {
                "query": "*message:.TooManyRowsException",
                "allow_leading_wildcard": true
            }
        }
    }
    

    应该匹配所有以message:开始并以.ToomanyRowsExceptions结束的异常。您可能还希望将default_field设置为messages。更多的信息可以在这里找到。另外,query_string查询不仅仅允许通配符搜索。它分析查询,并解析等内容。就像@Gabriel提到的,如果您只想要通配符搜索,通配符查询对您来说可能是一个更好的选择:

    {
        "query": {
            "wildcard": {
                "message": {
                    "value": "*.TooManyRowsException",
                }
            }
        }
    }
    

    编辑:根据反馈更改查询示例

    编辑2:您的查询确实是正确的。问题似乎在于您的自定义分析器。查询字符串与Analysed字段匹配,您的uax_email_analyzer基于标准分析器:

    {
      "analyzer": "custom_standard",
      "text": "org.jooq.exception.TooManyRowsException"
    }
    

    回报

    {
      "tokens" : [
        {
          "token" : "org.jooq.exception.toomanyrowsexcept",
          "start_offset" : 0,
          "end_offset" : 39,
          "type" : "<ALPHANUM>",
          "position" : 0
        }
      ]
    }
    

    因此,您的inital查询将不匹配,而

    {
        "query": {
            "query_string": {
                "query": "message:*org.jooq.exception.toomanyrowsexcept"
            }
        }
    }
    

    实际上返回匹配项。我可能会对异常消息等字段使用不同的分析器,但也可以先通过分析器发送查询文本。

     类似资料:
    • 问题内容: 我很难用Elasticsearch构建查询。 我想查询类似的东西: 所以我试图构造的是这样的: 但这似乎返回一个错误。 谁能给我一个指针,我应该如何看待用Elasticsearch进行这种OR查询? 我当前的数据已发送: 和我的查询: 返回此错误: 问题答案: 这是由于JSON格式错误所致。此查询的正确JSON格式如下-

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

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

    • 问题内容: 不知道如何为我的问题加上标题…大声笑。 以下是我需要的。 我的数据库中的值如下所示:test_example-1,test_example-2,test_example-TD-1 这些值的长度可以不同,“ test_example-”仅是示例,某些值的名称也有所不同。 当我执行查询以获取所有看起来像“ test_example-”的值时,我得到了所有信息,因为我以这种方式使用通配符“

    • 是否有可能在我的Firebase查询中插入通配符? 例如。

    • 我有2个查询相关Java泛型 1)我对java泛型很陌生。我正在尝试转换通配符,如下所示: 我想从列表中找出对象的类型 2)我有以下方法: 那为什么我在试图调用复制(整数,浮点数)的时候会出现编译错误呢?这里怎么了?