Kibana正则表达式搜索

24

我是ELK的新手。我想基于字段中单词的出现顺序来搜索文档。例如,

在doc1中,my_field为"MY FOO WORD BAR EXAMPLE";
在doc2中,my_field为"MY BAR WORD FOO EXAMPLE"

我想在Kibana中查询以“FOO”后跟“BAR”而不是相反顺序的文档。因此,在这种情况下,我希望doc1返回,而不是doc2。我尝试在Kibana搜索中使用以下查询。但是,它不起作用。该查询甚至没有产生任何搜索结果。

my_field.raw:/.*FOO.*BAR.*/

我也尝试使用分析过的字段(只是my_field),但我知道那应该不起作用。当然,那也没有产生任何结果。

请帮我解决这个正则表达式搜索问题。为什么我的查询没有找到匹配项?

3个回答

4
GET /_search
{
    "query": {
        "regexp": {
            "user": {
                "value": "k.*y",
                "flags" : "ALL",
                "max_determinized_states": 10000,
                "rewrite": "constant_score"
            }
        }
    }
}

更多细节在这里。 点击此处

9
你要如何在GUI网页控制台中完成这个操作? - Rodney S. Foley
1
@RodneyS.Foley 在左上角您应该看到 添加筛选器 +在弹出窗口中单击“编辑查询DSL” - Cryolithic

3
我不确定为什么那个正则表达式查询不起作用,但我相信Kibana正在使用Elasticsearch的查询字符串查询,文档在这里,例如,您可以通过将搜索内容放在双引号中来进行短语查询(在链接中有说明),它将查找“foo”后跟“bar”的单词。这样做效果更好,因为您会在已分析的字段(my_field)上执行此操作,其中已对每个单词进行了标记化以执行快速查找。所以你在Kibana中的搜索应该是:

my_field:“FOO BAR”

更新:

看起来这是Kibana的一个恼人的怪癖(可能是出于向后兼容性的原因)。无论如何,这不能匹配您,因为您正在针对非分析字段进行搜索,并且显然Kibana默认将搜索小写,因此它不会匹配非分析的大写“FOO”。您可以在Kibana高级设置中进行配置,在这里提到,具体地通过将配置选项“lowercase_expanded_terms”设置为false。


感谢您的回复。不仅如此,即使“FOO”和“BAR”被其他单词分隔开,我也需要所有文档。<br> 例如: 匹配 doc1,my_field:“MY FOO WORD BAR EXAMPLE”。 <br> 不匹配 doc2,my_field:“MY BAR WORD FOO EXAMPLE”。 - Krishna Chaitanya
所以,我需要正则表达式而不是短语匹配。 - Krishna Chaitanya
好的,我弄清楚了为什么你会遇到这个问题(Kibana 的奇怪问题),已经更新了答案。 - RyanR
从性能的角度来看,使用一个接近查询(即短语匹配)并设置高斜率值和in_order = true可以实现正则表达式的效果,并且您可以针对已经分析过的字段进行操作,我认为这样会更好地执行(因为每个标记都有其顺序,所以理论上它会先查找两个标记,然后确保indexOf(bar) > indexOf(foo))。此处有类似的答案- https://dev59.com/HYTba4cB1Zd3GeqP97Vg#26637081 - RyanR

3

Kibana的标准查询语言基于Lucene查询语法

默认分析器将文本划分为不同的单词:[MY,FOO,WORD,BAR,EXAMPLE]。

在Kibana中,您可以尝试以下搜索字符串,而不是使用正则表达式匹配:

my_field: FOO AND my_field: BAR

如果你的“my_field”数据看起来像“MYFOOWORDBAREXAMPLE”,无法进行标记化,那么你应该使用查询字符串:

my_field: *FOO*BAR*

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接