Quay lại
Bài 3: Full text query - Match Query

Trong Elasticsearch, full text queries là các loại truy vấn được sử dụng để tìm kiếm dữ liệu dựa trên nội dung của văn bản. Cụ thể, chúng được thiết kế để tìm kiếm thông qua toàn bộ văn bản trong các trường văn bản, thường được sử dụng cho các trường văn bản dài như nội dung của một bài báo, một email, hoặc một tài liệu văn bản.

Một số loại truy vấn full text phổ biến trong Elasticsearch bao gồm:

  1. Match Query: Tìm kiếm các tài liệu chứa một từ hoặc một cụm từ cụ thể.

  2. Multi-match Query: Tìm kiếm các tài liệu chứa một từ hoặc một cụm từ trong nhiều trường khác nhau.

  3. Query String Query: Cho phép bạn sử dụng cú pháp truy vấn mạnh mẽ để tìm kiếm thông qua nhiều trường và áp dụng các toán tử logic.

  4. Simple Query String Query: Tương tự như Query String Query nhưng sử dụng cú pháp đơn giản hơn.

  5. Match Phrase Query: Tìm kiếm các tài liệu chứa một cụm từ chính xác, theo thứ tự cụ thể.

  6. Common Terms Query: Tìm kiếm các tài liệu dựa trên các từ phổ biến, loại bỏ các từ không quan trọng.

  7. Fuzzy Query: Tìm kiếm các từ gần giống với một từ cụ thể.

  8. Prefix Query: Tìm kiếm các từ bắt đầu bằng một chuỗi cụ thể.

  9. Wildcard Query: Tìm kiếm các từ chứa các ký tự đại diện.

  10. Range Query: Tìm kiếm các giá trị trong một phạm vi cụ thể.

Với các truy vấn full text, Elasticsearch sẽ phân tích và xử lý dữ liệu văn bản để tìm kiếm các từ, cụm từ, hoặc biểu thức tương tự mà bạn cung cấp, đồng thời đảm bảo tính linh hoạt và hiệu suất trong quá trình tìm kiếm.

Match Query

Trong Elasticsearch, Match Query là một loại truy vấn full text được sử dụng để tìm kiếm các tài liệu chứa một từ cụ thể hoặc một cụm từ cụ thể. Khi sử dụng Match Query, Elasticsearch sẽ phân tích từ hoặc cụm từ bạn cung cấp và tìm kiếm các tài liệu chứa những từ đó.

Dưới đây là cấu trúc cơ bản của một Match Query:

{
  "query": {
    "match": {
      "field_name": "search_term"
    }
  }
}​

Trong đó:

  1. "query" là phần của truy vấn chứa các điều kiện tìm kiếm.
  2. "match" là loại truy vấn, chỉ định bạn đang sử dụng truy vấn kiểu match.
  3. "field_name" là tên của trường mà bạn muốn tìm kiếm.
  4. "search_term" là từ hoặc cụm từ mà bạn muốn tìm kiếm trong trường đó.

Thực hành

Data sample:

PUT clients

PUT clients/_mapping
{
  "properties": {
    "birth_date": {
      "type": "date",
      "format": "dd/MM/yyyy"
    }
  }
}
POST customers/_bulk
{"create": {"_id": 1}}
{"id": 1, "name": "son", "email": "son@gmail.com", "gender": "male", "birth_date": "12/12/1980", "age": 40, "group": "Sales", "country": "vietnam", "hobbies": "I like sports and piano", "amount": 4000 }
{"create": {"_id": 2}}
{"id": 2, "name": "Danny", "email": "danny@gmail.com", "gender": "male", "birth_date": "12/12/1970", "age": 57, "group": "Managers", "country": "thailan", "hobbies": "I like sports Thai lan and play game", "amount": 5000 }
{"create": {"_id": 3}}
{"id": 3, "name": "Lisa", "email": "lisa@gmail.com", "gender": "female", "birth_date": "12/12/1995", "age": 30, "group": "Suporters", "country": "US", "hobbies": "I like sports US and music", "amount": 6000 }
{"create": {"_id": 4}}
{"id": 4, "name": "son", "email": "sondinh@gmail.com", "gender": "male", "birth_date": "12/12/1985", "age": 40, "group": "Sales", "country": "vietnam", "hobbies": "I into swiming", "amount": 4000}
{"create": {"_id": 6}}
{"id": 6, "name": "son", "email": "sondinh5@gmail.com", "gender": "male", "birth_date": "12/12/1985", "age": 30, "group": "Sales", "country": "vietnam", "hobbies": "I have a swings", "amount": 4000}
{"create": {"_id": 7}}
{"id": 7, "name": "son", "email": "sondinh7@gmail.com", "gender": "male", "birth_date": "12/12/1985", "age": 30, "group": "Sales", "country": "vietnam", "hobbies": "sporces", "amount": 4000}
{"create": {"_id": 8}}
{"id": 8, "name": "son_name", "email": "sondinh7@gmail.com", "gender": "male", "birth_date": "12/12/1985", "age": 30, "group": "Sales", "country": "vietnam", "hobbies": "sporces", "amount": 4000}

Trong match query của Elasticsearch, có một số options phổ biến mà bạn có thể sử dụng để tinh chỉnh và cải thiện kết quả tìm kiếm của bạn. Dưới đây là một số options phổ biến và thường được sử dụng trong match query:

  1. query: Option này định nghĩa từ hoặc cụm từ mà bạn muốn tìm kiếm trong trường cụ thể. Mặc định là "OR".

    • POST customers/_search
      {
        "query": {
         "match": {
           "hobbies": {
             "query":  "like music piano" // "like OR music OR piano"
           }
         }
        }
      }
  2. operator: Xác định toán tử logic được sử dụng để kết hợp các từ trong truy vấn. Có hai giá trị phổ biến là "OR" và "AND". Mặc định là "OR".

    • POST customers/_search
      {
        "query": {
          "match": {
            "hobbies": {
              "query": "music sports I",
              "operator": "and"
            }
          }
        }
      }
  3. analyzer: Đặc định analyzer sẽ được sử dụng để phân tích từ hoặc cụm từ trong truy vấn. Mặc định, Elasticsearch sử dụng analyzer của trường được tìm kiếm.

  4. boost: Để sử dụng tính năng boost trong Elasticsearch để làm giảm giá trị một trường hơn so với trường khác trong các truy vấn tìm kiếm, bạn có thể sử dụng tham số boost trong các truy vấn tìm kiếm. Tham số này cho phép bạn chỉ định mức độ ưu tiên của một trường so với trường khác trong quá trình tính toán điểm số của kết quả tìm kiếm.
    • POST customers/_search
      {
        "query": {
         "match": {
           "hobbies": {
             "query":  "like music piano",
             "boost": 100
           }
         }
        }
      }
  5. fuzziness: Tính năng "fuzziness" trong Elasticsearch cho phép tìm kiếm các từ gần giống với từ được chỉ định. Điều này hữu ích khi bạn muốn tìm kiếm các từ có thể bị sai chính tả hoặc được ghi lại một cách không chính xác.

    • Khi bạn sử dụng fuzziness trong một truy vấn tìm kiếm, Elasticsearch sẽ tìm kiếm các từ gần giống với từ bạn cung cấp, dựa trên mức độ "distance" giữa các từ. Mức độ distance này có thể được đo bằng cách đếm số lượng thay đổi (sửa đổi, thêm hoặc xóa ký tự) cần thiết để chuyển từ mục tiêu thành từ được tìm kiếm.
    • POST customers/_search
      {
        "query": {
         "match": {
           "hobbies": {
             "query":  "kskports",
             "fuzziness": 2 // "AUTO" hoặc // MAX fuzziness là 0, 1, 2
           }
         }
        }
      }
      • Khi bạn đặt fuzziness là 1, Elasticsearch sẽ chỉ tìm kiếm các từ gần giống với từ được chỉ định với một chỉnh sửa duy nhất (thêm, loại bỏ hoặc thay đổi một ký tự). Điều này có nghĩa là từ "kskports" có thể được so sánh với các từ gần giống như "sports", nhưng sẽ không khớp chính xác với các từ như "sports" vì hai ký tự cần phải được thay đổi.

        Tuy nhiên, trong trường hợp fuzziness được đặt thành 2, Elasticsearch sẽ tìm kiếm các từ gần giống với từ được chỉ định với tối đa hai chỉnh sửa. Điều này có nghĩa là từ "kskports" có thể được so sánh với các từ gần giống như "sports", nên có thể khớp với các từ "sports" nếu một ký tự được thay đổi.

  6. prefix_length: Đặt số ký tự tối thiểu mà một từ phải có trước khi fuzzy matching bắt đầu.

    • POST customers/_search
      {
        "query": {
         "match": {
           "hobbies": {
             "query":  "sporfts",
             "prefix_length": 3,
             "fuzziness": 2
           }
         }
        }
      }
      • Trong trường hợp trên, prefix_length được đặt là 3. Điều này có nghĩa là Elasticsearch sẽ yêu cầu từ gốc phải có ít nhất 3 ký tự khớp với trước khi bắt đầu fuzzy matching. Nếu từ gốc có ít hơn 3 ký tự, Elasticsearch sẽ bỏ qua fuzzy matching và không xem xét fuzziness.

        Ví dụ:

        • Nếu bạn tìm kiếm từ "sports" và prefix_length được đặt là 3, Elasticsearch sẽ tìm kiếm các từ gần giống với "sports" chỉ khi chúng có ít nhất 3 ký tự khớp với "speorfts" (tức là "spo").
        • Tuy nhiên, nếu từ gốc là "orfts" và prefix_length được đặt là 3, Elasticsearch sẽ bỏ qua fuzzy matching vì chỉ có 2 ký tự khớp với "speorfts" không đủ để đạt được prefix_length.
  7. max_expansions: Xác định số lượng tối đa các biến thể từ có thể được tìm thấy.

    • POST customers/_search
      {
        "query": {
         "match": {
           "hobbies": {
             "query":  "sporces",
             "fuzziness": 2,
             "max_expansions": 1
           }
         }
        }
      }
  8. minimum_should_match: Xác định số lượng tối thiểu các từ phải khớp trong trường hợp sử dụng operator là "OR".

    • POST customers/_search
      {
        "query": {
          "match": {
            "hobbies": {
              "query": "music sports I",
              "minimum_should_match": 1
            }
          }
        }
      }
      • Khi bạn đặt minimum_should_match là một số lớn hơn 1, thì các điều kiện trong match query sẽ hoạt động như phép toán AND. Điều này có nghĩa là tất cả các từ cần tìm kiếm phải xuất hiện trong trường được tìm kiếm để tài liệu được xem xét là khớp.

        Tuy nhiên, khi bạn đặt minimum_should_match là 1, thì điều kiện trong match query sẽ hoạt động như phép toán OR. Trong trường hợp này, nếu ít nhất một trong các từ cần tìm kiếm xuất hiện trong trường được tìm kiếm, thì tài liệu sẽ được xem xét là khớp.

 

Bình luận (0)

Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough
Michael Gough

Bài viết liên quan

Learning English Everyday