2014-01-14 65 views
3

我在正確表達ElasticSearch正則表達式篩選器的正則表達式時出現問題。我試圖在網址字段中的「info-for/media」中匹配任何內容,例如http://mydomain.co.uk/info-for/media/press-release-1。要嘗試獲得正確的正則表達式,我現在使用的是match_all,但最終將使用用戶的查詢字符串match_phraseElasticSearch正則表達式篩選器

POST爲localhost:9200/_search

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

這將返回0命中,但正確地解析。 .*info.*確實會得到包含該網址的結果,但不幸的是該網址過於寬泛,例如匹配包含「信息」的任何網址。只要我在「info-for」中添加連字符,我就會再次得到0個結果。無論我嘗試使用哪種轉義字符組合,我都會得到解析異常,或者無法匹配。任何人都可以幫助解釋我做錯了什麼?

回答

7

首先,儘量不要使用沒有前綴的正則表達式或通配符。搜索.*foo.*的方式是,索引字典中的每個單詞都與模式匹配,而模式又被構造爲匹配項的OR查詢。這是O(n)中語料庫中唯一詞語的數量,後續搜索也相當昂貴。

這篇文章有關於一些細節:https://www.found.no/foundation/elasticsearch-from-the-bottom-up/

其次,您的網址是可能的方式,使「信息的」和「媒體」獨立的索引項標記化。因此,字典中沒有info-for/media-term用於匹配正則表達式。

您可能想要做的是分別爲路徑和域編制索引,並使用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。這是一個大規模更高性能的過濾器,也可以緩存。

+1

一個更簡單的選項是將此字段映射爲未分析版本的多字段,並在未分析字段上運行regexp過濾器。一般來說,正則表達式過濾器在非分析字段上更有意義。 –

+0

這仍然是一個非常昂貴的查詢來執行。 –

+0

謝謝@AlexBrasetvik我在將映射/分析器配置的JSON版本發佈到我的索引_settings端點時遇到了一些困難。它無法找到我聲明的分析器。如果你有它,示例JSON會非常有幫助,謝謝。 – idlemind