ElasticSearch Regexp过滤器

 persisit110 发布于 2023-02-03 04:02

我在为ElasticSearch Regexp过滤器正确表达正则表达式时遇到问题.我正在尝试匹配url字段中"info-for/media"中的任何内容,例如http://mydomain.co.uk/info-for/media/press-release-1.要尝试正确使用正则表达式,我现在正在使用match_all,但最终将match_phrase使用用户的查询字符串.

POST到localhost:9200/_search

{
"query" : {
               "match_all" : { },
               "filtered" : {
                           "filter" : {
                                   "regexp": {
                                        "url":".*info-for/media.*" 
                                    }
                          }
                }
         },
}

这会返回0次点击,但会正确解析..*info.*确实得到包含网址的结果,但不幸的是太宽泛,例如匹配任何包含"信息"的网址.一旦我在"info-for"中添加连字符,我再次获得0结果.无论我尝试哪种转义字符组合,我要么得到一个解析异常,要么没有匹配.任何人都可以帮忙解释我做错了什么吗?

1 个回答
  • 首先,尽可能尝试不要使用没有前缀的正则表达式或通配符.搜索的方式.*foo.*是,索引字典中的每个单词都与模式匹配,而模式又构造成匹配项的OR查询.这是您的语料库中唯一术语数量的O(n),随后的搜索也非常昂贵.

    本文有更多详细信息:https://www.found.no/foundation/elasticsearch-from-the-bottom-up/

    其次,您的网址可能会以某种方式进行标记,使索引中的"信息"和"媒体"分开.因此,info-for/media字典中没有用于匹配正则表达式的术语.

    你可能想要做的是分别索引路径和域,使用path_hierarchy -tokenizer来生成术语.

    这是一个演示如何生成令牌的示例:https://www.found.no/play/gist/ecf511d4102a806f350b#analysis

    /foo/bar/baz生成令牌/foo/bar/baz, /foo/bar, /foo,域foo.example.com被标记化为foo.example.com, example.com, com

    搜索下面的任何内容/foo/bar可以是简单的术语过滤器匹配path:/foo/bar.这是一个性能更高的过滤器,也可以缓存.

    2023-02-03 04:31 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有