首頁 > 資料庫 > mysql教程 > 如何優化Elasticsearch中電子郵件和電話號碼的模糊匹配?

如何優化Elasticsearch中電子郵件和電話號碼的模糊匹配?

Patricia Arquette
發布: 2024-10-30 15:51:02
原創
483 人瀏覽過

How to Optimize Fuzzy Matching of Emails and Phone Numbers in Elasticsearch?

Elasticsearch 中模糊匹配電子郵件和電話號碼

Elasticsearch 提供靈活的方法來模糊匹配數據,包括電子郵件和電話號碼。本文探討如何使用自訂分析器和標記過濾器來最佳化此類查詢的效能。

用於模糊匹配的自訂分析器

要有效地模糊匹配電子郵件和電話號碼,需要建議在 Elasticsearch 中建立自訂分析器。這些分析器由一個準備分析輸入資料的分詞器和一組執行特定轉換的過濾器組成。

電子郵件分析器

index_email_analyzer 分析器利用標準分詞器來分解輸入。然後,它應用 lowercase、name_ngram_filter 和 trim 等過濾器將電子郵件轉換為小寫,產生不同長度的 ngram(3 到 20 個字元),並刪除空格。

search_email_analyzer 類似地使用標準分詞器,但僅使用小寫和修剪過濾器。這為搜尋準備了輸入,其中不需要 ngram 過濾器。

電話分析器

對於電話號碼,index_phone_analyzer 利用 digital_edge_ngram_tokenizer 產生不同長度的 ngram以數字開頭的(1 到 15 個字元)。這允許匹配電話號碼的任何前綴。 digital_only 字元過濾器會刪除非數字字符,以確保僅分析數字值。

search_phone_analyzer 使用關鍵字分詞器,它會從輸入產生單一標記,從而實現電話號碼的精確匹配。

實作分析器

以下是包含這些自訂分析器的範例對應:

PUT myindex
{
  "settings": {
    "analysis": {
      "analyzer": {
        "email_url_analyzer": {
          "type": "custom",
          "tokenizer": "uax_url_email",
          "filter": [ "trim" ]
        },
        "index_phone_analyzer": {
          "type": "custom",
          "char_filter": [ "digit_only" ],
          "tokenizer": "digit_edge_ngram_tokenizer",
          "filter": [ "trim" ]
        },
        "search_phone_analyzer": {
          "type": "custom",
          "char_filter": [ "digit_only" ],
          "tokenizer": "keyword",
          "filter": [ "trim" ]
        },
        "index_email_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [ "lowercase", "name_ngram_filter", "trim" ]
        },
        "search_email_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "filter": [ "lowercase", "trim" ]
        }
      },
      "char_filter": {
        "digit_only": {
          "type": "pattern_replace",
          "pattern": "\D+",
          "replacement": ""
        }
      },
      "tokenizer": {
        "digit_edge_ngram_tokenizer": {
          "type": "edgeNGram",
          "min_gram": "1",
          "max_gram": "15",
          "token_chars": [ "digit" ]
        }
      },
      "filter": {
        "name_ngram_filter": {
          "type": "ngram",
          "min_gram": "1",
          "max_gram": "20"
        }
      }
    }
  },
  "mappings": {
    "your_type": {
      "properties": {
        "email": {
          "type": "string",
          "analyzer": "index_email_analyzer",
          "search_analyzer": "search_email_analyzer"
        },
        "phone": {
          "type": "string",
          "analyzer": "index_phone_analyzer",
          "search_analyzer": "search_phone_analyzer"
        }
      }
    }
  }
}
登入後複製

執行模糊查詢

執行模糊詢問>
POST myindex
{
  "query": {
    "term": {
      "email": "@gmail.com"
    }
  }
}

POST myindex
{
  "query": {
    "term": {
      "phone": "136"
    }
  }
}
登入後複製

要匹配以“@gmail.com”結尾的電子郵件或以“136”開頭的電話號碼,您可以發出以下查詢:

這些查詢將利用自定義分析器產生模糊所需的ngram匹配。

以上是如何優化Elasticsearch中電子郵件和電話號碼的模糊匹配?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板