天天看點

深入解析Elasticsearch:優化搜尋與分析,提升資料處理效率

作者:樹言樹語Tree

當談到搜尋和分析大規模資料時,Elasticsearch 是一個非常強大的開源搜尋和分析引擎。在本講解中,我們将探讨 Elasticsearch 中的映射與分析的概念、字段類型、自定義映射、分析器與标記器,以及分析過程和詞項查詢的相關内容。

映射與分析:

在 Elasticsearch 中,映射(mapping)用于定義文檔的資料結構和字段的類型。它告訴 Elasticsearch 如何解析和索引文檔,以便進行快速和有效的搜尋。映射還用于定義字段的分析(analysis)方式,即将文本分解為詞項(terms)的過程。分析過程可以通過分析器(analyzer)和标記器(tokenizer)來自定義。

映射的概念與字段類型:

在 Elasticsearch 中,映射定義了索引中的字段類型。字段類型決定了字段如何被存儲和索引,以及對字段的搜尋行為進行了哪些優化。一些常見的字段類型包括:

  • text:用于全文搜尋的文本字段類型,會進行分析和标記化。
  • keyword:适用于結構化搜尋的關鍵字字段類型,不會進行分析。
  • date:日期類型,可以存儲日期和時間。
  • numeric:數值類型,如整數(integer)、長整數(long)、浮點數(float)等。
  • geo_point:用于存儲經緯度坐标。
  • object:用于嵌套對象的字段類型。

以下是一個示例,展示如何定義一個具有不同字段類型的映射:

PUT /my_index
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text"
      },
      "category": {
        "type": "keyword"
      },
      "created_at": {
        "type": "date"
      },
      "views": {
        "type": "integer"
      },
      "location": {
        "type": "geo_point"
      },
      "tags": {
        "type": "text"
      },
      "author": {
        "type": "object",
        "properties": {
          "name": {
            "type": "text"
          },
          "age": {
            "type": "integer"
          }
        }
      }
    }
  }
}
           

自定義映射:

在 Elasticsearch 中,我們可以根據特定需求自定義映射,以更精确地控制字段類型和分析器等設定。自定義映射可以幫助我們優化搜尋和分析過程,以及提高結果的準确性。

下面是一個示例,展示如何自定義映射及其相關設定:

PUT /my_index
{
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "english",
        "search_analyzer": "english_search"
      }
    }
  },
  "settings": {
    "analysis": {
      "analyzer": {
        "english": {
          "type": "standard",
          "stopwords": ["a", "an", "the"]
        },
        "english_search": {
          "type": "standard",
          "stopwords": ["a", "an", "the"],
          "max_token_length": 5
        }
      }
    }
  }
}
           

在上述示例中,我們定義了一個名為 my_index 的索引,并在映射中建立了一個名為 content 的文本字段。該字段使用了自定義的分析器和搜尋分析器。分析器 english 使用了标準分析器,并定義了常見英文停用詞(stopwords),如 "a"、"an" 和 "the"。搜尋分析器 english_search 也使用了标準分析器,但還定義了一個 max_token_length 參數,用于限制分析器輸出的最大詞項長度。

通過自定義映射和分析器設定,我們可以控制文本字段的分析過程,包括詞項化、停用詞處理、大小寫轉換等。這樣可以確定搜尋和分析的準确性和一緻性,提高搜尋結果的品質。

請注意,以上示例僅展示了自定義映射和分析器的基本用法,實際應用中可能需要根據具體情況進行更詳細的配置和調整。

分析器與标記器:

在 Elasticsearch 中,分析器(analyzer)和标記器(tokenizer)是映射和文本分析的核心元件。分析器負責将文本字段分解為詞項(terms),而标記器是分析器中的一部分,負責将文本分解成單個的标記。

Elasticsearch 提供了許多内置的分析器和标記器,例如:

  • standard:預設分析器,根據空格和标點符号進行分詞。
  • simple:根據非字母字元進行分詞,轉換為小寫。
  • whitespace:根據空格進行分詞。
  • keyword:不進行分詞,将整個字段作為一個詞項。

下面是一個示例,展示如何使用自定義分析器和标記器:

PUT /my_index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "custom_analyzer": {
          "tokenizer": "standard",
          "filter": ["lowercase", "my_stopwords"]
        }
      },
      "filter": {
        "my_stopwords": {
          "type": "stop",
          "stopwords": ["and", "or", "but"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "content": {
        "type": "text",
        "analyzer": "custom_analyzer"
      }
    }
  }
}
           

在上述示例中,我們定義了一個名為 custom_analyzer 的自定義分析器,它使用了 standard 标記器進行分詞,并應用了兩個過濾器:lowercase 将詞項轉換為小寫,my_stopwords 根據自定義停用詞清單過濾詞項。停用詞過濾器可以幫助排除常見的無意義詞彙,如 "and"、"or" 和 "but"。

通過自定義分析器和标記器,我們可以根據需求進行更精細的文本處理,例如去除停用詞、應用同義詞擴充、使用正規表達式進行詞項切分等。

分析過程和詞項查詢:

在 Elasticsearch 中,分析過程将文本字段分解為一系列詞項,這些詞項将用于建構反向索引,以支援高效的全文搜尋。當執行搜尋時,查詢字元串也會經過相同的分析過程進行處理,以便與索引中的詞項比對。

以下是一個示例,展示如何進行詞項查詢:

GET /my_index/_search
{
  "query": {
    "match": {
      "content": "example text"
    }
  }
}
           

在上述示例中,我們執行了一個詞項查詢,搜尋包含 "example" 和 "text" 詞項的文檔。查詢字元串将通過與映射中指定的相同分析器進行分析和處理,以便與索引中的詞項進行比對。這樣可以確定查詢字元串與文檔内容的分析方式一緻,進而獲得準确的搜尋結果。

在執行詞項查詢時,Elasticsearch會使用反向索引來快速定位比對的文檔。反向索引是一種以詞項為鍵,将詞項與文檔關聯起來的索引結構,它可以快速找到包含特定詞項的文檔。

通過詞項查詢,我們可以進行全文搜尋、短語搜尋、字首搜尋等。此外,Elasticsearch還提供了各種查詢類型和過濾器,以支援更進階的搜尋需求。

總結: 在本講解中,我們詳細介紹了 Elasticsearch 中的映射與分析相關的概念。我們探讨了字段類型的定義和使用,展示了如何自定義映射、分析器和标記器,以及如何進行詞項查詢。這些概念和技術可以幫助我們優化搜尋和分析過程,進而提高 Elasticsearch 的效率和準确性。

請注意,示例中的代碼片段僅用于示範目的,實際應用中可能需要根據具體需求進行适當調整和,建議查閱 Elasticsearch 官方文檔和相關資源以擷取更詳細的指導和實際示例。

每天堅持學習一點點,不求有回報,隻願可以豐富自己!!!

繼續閱讀