1. 程式人生 > >elasticsearch-wildcard、regexp萬用字元與正則表示式查詢

elasticsearch-wildcard、regexp萬用字元與正則表示式查詢

萬用字元與正則表示式查詢

假設將郵編作為 not_analyzed 的精確值欄位索引,所以可以為其建立索引,如下:

PUT /my_index
{
    "mappings": {
        "address": {
            "properties": {
                "postcode": {
                    "type":  "string",
                    "index": "not_analyzed"
                }
            }
        }
    }
}

與 prefix 字首查詢的特性類似, wildcard 萬用字元查詢也是一種底層基於詞的查詢,與字首查詢不同的是它允許指定匹配的正則式。它使用標準的 shell 萬用字元查詢: ? 匹配任意字元, * 匹配 0 或多個字元。

這個查詢會匹配包含 W1F 7HW 和 W2F 8HW 的文件:

GET /my_index/address/_search
{
    "query": {
        "wildcard": {
            "postcode": "W?F*HW" (1)
        }
    }
}
  1. ? 匹配 1 和 2 , * 與空格及 7 和 8 匹配。

設想如果現在只想匹配 W 區域的所有郵編,字首匹配也會包括以 WC 開頭的所有郵編,與萬用字元匹配碰到的問題類似,如果想匹配只以 W 開始並跟隨一個數字的所有郵編, regexp 正則式查詢允許寫出這樣更復雜的模式:

GET /my_index/address/_search
{
    "query": {
        "regexp": {
            "postcode": "W[0-9].+" (1)
        }
    }
}
  1. 這個正則表示式要求詞必須以 W 開頭,緊跟 0 至 9 之間的任何一個數字,然後接一或多個其他字元。

這也意味著需要同樣注意字首查詢存在效能問題,對有很多唯一詞的欄位執行這些查詢可能會消耗非常多的資源,所以要避免使用左通配這樣的模式匹配(如: *foo 或 .*foo 這樣的正則式)。

轉載於:https://blog.csdn.net/chuan442616909/article/details/57910101