我有一個問題查詢字段(標題)使用查詢字符串正則表達式。彈性搜索查詢字符串正則表達式
這工作:「稱號:/測試/」
這不:「稱號:/ ^測試$ /」
我的目標它要做精確的匹配,但是這個匹配不應該是部分的,它應該匹配整個字段的值。
有沒有人有一個想法這裏可能是錯的?
我有一個問題查詢字段(標題)使用查詢字符串正則表達式。彈性搜索查詢字符串正則表達式
這工作:「稱號:/測試/」
這不:「稱號:/ ^測試$ /」
我的目標它要做精確的匹配,但是這個匹配不應該是部分的,它應該匹配整個字段的值。
有沒有人有一個想法這裏可能是錯的?
Lucene的正則表達式引擎不Perl兼容但支持更小的範圍內的操作符。
您正在使用的錨^
和$
,那些不支持的原因是沒有必要的,再從文檔
Lucene的圖案總是固定。所提供的模式必須如果您正在尋找
phrase query
實物不符的,你可以使用double quotes
這樣{ "query": { "query_string": { "default_field": "title", "query": "\"test phrase\"" } } }
整個字符串
匹配,但這樣做也符合像測試短語someword與權屬文件
如果你想確切比賽,你應該尋找term queries,讓您的標題字段映射"index" : "not_analyzed"
或者您可以使用keyword analyzer和lowercase filter進行不區分大小寫的匹配。您的查詢應該是這樣的
{
"query": {
"term": {
"title": {
"value": "my title"
}
}
}
}
這會給你確切匹配
通常在正則表達式的^和$符號用來表示該文本應位於的開始/結束字符串。這被稱爲錨定。 Lucene正則表達式模式默認是錨定的。
因此,使用Elasticsearch的模式「測試」相當於Java中的「^ test $」。
您必須努力「解除」您的模式,例如通過使用「te。*」來匹配「測試」,「測試」和「牙齒」。因爲「測試」模式只會匹配「測試」。
請注意,這需要該字段不被分析,並且還要注意它有可怕的性能。對於精確匹配,請使用ChintanShah25答案中所述的術語過濾器。
我認爲完全匹配你可以使用默認的[匹配查詢](https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-match-query.html) – stevenll