2015-12-16 66 views
1

我有一個問題查詢字段(標題)使用查詢字符串正則表達式。彈性搜索查詢字符串正則表達式

這工作:「稱號:/測試/」
這不:「稱號:/ ^測試$ /」

但是,一提到它支持https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-regexp-query.html#regexp-syntax

我的目標它要做精確的匹配,但是這個匹配不應該是部分的,它應該匹配整個字段的值。

有沒有人有一個想法這裏可能是錯的?

+0

我認爲完全匹配你可以使用默認的[匹配查詢](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html) – stevenll

回答

2

documentation

Lucene的正則表達式引擎不Perl兼容但支持更小的範圍內的操作符。

您正在使用的錨^$,那些不支持的原因是沒有必要的,再從文檔

Lucene的圖案總是固定。所提供的模式必須如果您正在尋找phrase query實物不符的,你可以使用double quotes這樣

{ 
    "query": { 
    "query_string": { 
     "default_field": "title", 
     "query": "\"test phrase\"" 

    } 
    } 
} 

整個字符串

匹配,但這樣做也符合像測試短語someword與權屬文件

如果你想確切比賽,你應該尋找term queries,讓您的標題字段映射"index" : "not_analyzed"或者您可以使用keyword analyzerlowercase filter進行不區分大小寫的匹配。您的查詢應該是這樣的

{ 
    "query": { 
    "term": { 
     "title": { 
     "value": "my title" 
     } 
    } 
    } 
} 

這會給你確切匹配

2

通常在正則表達式的^和$符號用來表示該文本應位於的開始/結束字符串。這被稱爲錨定。 Lucene正則表達式模式默認是錨定的。

因此,使用Elasticsearch的模式「測試」相當於Java中的「^ test $」。

您必須努力「解除」您的模式,例如通過使用「te。*」來匹配「測試」,「測試」和「牙齒」。因爲「測試」模式只會匹配「測試」。

請注意,這需要該字段不被分析,並且還要注意它有可怕的性能。對於精確匹配,請使用ChintanShah25答案中所述的術語過濾器。

相關問題