Logo Zephyrnet

Thực hiện tìm kiếm không phân biệt dấu bằng OpenSearch

Ngày:

Chúng ta thường cần tìm kiếm văn bản của mình để không phân biệt được dấu trọng âm. Không nhạy cảm với giọng nói tìm kiếm, còn được gọi là dấu phụ-bất khả tri tìm kiếm là nơi các kết quả tìm kiếm giống nhau đối với các truy vấn có thể chứa hoặc không chứa các ký tự Latinh như à, è, Ê, ñ và ç. Dấu phụ là các chữ cái tiếng Anh có trọng âm để đánh dấu sự khác biệt trong cách phát âm. Trong những năm gần đây, những từ có dấu phụ đã du nhập vào ngôn ngữ tiếng Anh phổ thông, chẳng hạn như café hay protégé. Chà, chạm vào! OpenSearch có câu trả lời!

OpenSearch là bộ phần mềm nguồn mở có khả năng mở rộng, linh hoạt và có thể mở rộng dành cho khối lượng công việc tìm kiếm của bạn. OpenSearch có thể được triển khai ở ba chế độ khác nhau: OpenSearch nguồn mở tự quản lý, OpenSearch được quản lý Dịch vụ Tìm kiếm Mở của AmazonAmazon OpenSearch Serverless. Tất cả ba chế độ triển khai đều được hỗ trợ bởi Apache Lucene và cung cấp phân tích văn bản bằng máy phân tích Lucene.

Trong bài đăng này, chúng tôi trình bày cách thực hiện tìm kiếm không phân biệt dấu bằng cách sử dụng OpenSearch để xử lý dấu phụ.

Tổng quan về giải pháp

Trình phân tích Lucene là các thư viện Java được sử dụng để phân tích văn bản trong khi lập chỉ mục và tìm kiếm tài liệu. Những máy phân tích này bao gồm các bộ mã thông báo và bộ lọc. Bộ mã thông báo chia văn bản đến thành một hoặc nhiều mã thông báo và các bộ lọc được sử dụng để chuyển đổi mã thông báo bằng cách sửa đổi hoặc xóa các ký tự không cần thiết.

OpenSearch hỗ trợ các trình phân tích tùy chỉnh, cho phép bạn định cấu hình các kết hợp mã thông báo và bộ lọc khác nhau. Nó có thể bao gồm các bộ lọc ký tự, bộ mã thông báo và bộ lọc mã thông báo. Để kích hoạt tìm kiếm không phân biệt dấu phụ, chúng tôi định cấu hình các bộ phân tích tùy chỉnh sử dụng bộ lọc mã thông báo gấp ASCII.

ASCIIFolding là một phương pháp được sử dụng để chuyển đổi các ký tự Unicode chữ cái, số và ký hiệu không có trong 127 ký tự ASCII đầu tiên (khối Unicode Latinh cơ bản) thành các ký tự ASCII tương đương, nếu có. Ví dụ: bộ lọc thay đổi “à” thành “a”. Điều này cho phép các công cụ tìm kiếm trả về kết quả bất khả tri về giọng điệu.

Trong bài đăng này, chúng tôi định cấu hình tìm kiếm không phân biệt giọng nói bằng bộ lọc ASCIIFolding được hỗ trợ trong Dịch vụ OpenSearch. Chúng tôi nhập một tập hợp tên phim Châu Âu có dấu phụ và xác minh kết quả tìm kiếm có và không có dấu phụ.

Tạo chỉ mục bằng trình phân tích tùy chỉnh

Đầu tiên chúng ta tạo chỉ mục asciifold_movies với máy phân tích tùy chỉnh custom_asciifolding:

PUT /asciifold_movies
{ "settings": { "analysis": { "analyzer": { "custom_asciifolding": { "tokenizer": "standard", "filter": [ "my_ascii_folding" ] } }, "filter": { "my_ascii_folding": { "type": "asciifolding", "preserve_original": true } } } }, "mappings": { "properties": { "title": { "type": "text", "analyzer": "custom_asciifolding", "fields": { "keyword": { "type": "keyword", "ignore_above": 256 } } } } }
}

Nhập dữ liệu mẫu

Tiếp theo, chúng tôi nhập dữ liệu mẫu có ký tự Latinh vào chỉ mục asciifold_movies:

POST _bulk
{ "index" : { "_index" : "asciifold_movies", "_id":"1"} }
{ "title" : "Jour de fête"}
{ "index" : { "_index" : "asciifold_movies", "_id":"2"} }
{ "title" : "La gloire de mon père" }
{ "index" : { "_index" : "asciifold_movies", "_id":"3"} }
{ "title" : "Le roi et l’oiseau" }
{ "index" : { "_index" : "asciifold_movies", "_id":"4"} }
{ "title" : "Être et avoir" }
{ "index" : { "_index" : "asciifold_movies", "_id":"5"} }
{ "title" : "Kirikou et la sorcière"}
{ "index" : { "_index" : "asciifold_movies", "_id":"6"} }
{ "title" : "Señora Acero"}
{ "index" : { "_index" : "asciifold_movies", "_id":"7"} }
{ "title" : "Señora garçon"}
{ "index" : { "_index" : "asciifold_movies", "_id":"8"} }
{ "title" : "Jour de fete"}

Truy vấn chỉ mục

Bây giờ chúng tôi truy vấn asciifold_movies chỉ mục cho các từ có và không có ký tự Latin.

Truy vấn đầu tiên của chúng tôi sử dụng ký tự có dấu:

GET asciifold_movies/_search
{
  "query": {
    "match": {
      "title": "fête"
    }
  }
}

Truy vấn thứ hai của chúng tôi sử dụng cách viết của cùng một từ mà không có dấu trọng âm:

GET asciifold_movies/_search
{
  "query": {
    "match": {
      "title": "fete"
    }
  }
}

Trong các truy vấn trước, cụm từ tìm kiếm “fête” và “fete” trả về cùng một kết quả:

{ "took": 10, "timed_out": false, "_shards": { "total": 5, "successful": 5, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 2, "relation": "eq" }, "max_score": 0.7361701, "hits": [ { "_index": "asciifold_movies", "_id": "8", "_score": 0.7361701, "_source": { "title": "Jour de fete" } }, { "_index": "asciifold_movies", "_id": "1", "_score": 0.42547938, "_source": { "title": "Jour de fête" } } ] }
}

Tương tự, hãy thử so sánh kết quả cho “señora” và “senora” hoặc “sorcière” và “sorciere”. Các kết quả không nhạy cảm với dấu trọng âm là do bộ lọc ASCIIFolding được sử dụng với máy phân tích tùy chỉnh.

Bật tính năng tổng hợp cho các trường có dấu

Bây giờ chúng ta đã kích hoạt tính năng tìm kiếm không phân biệt dấu trọng âm, hãy xem cách chúng ta có thể làm cho các tập hợp hoạt động có dấu.

Hãy thử truy vấn sau đây trên chỉ mục:

GET asciifold_movies/_search
{
  "size": 0,
  "aggs": {
    "test": {
      "terms": {
        "field": "title.keyword"
      }
    }
  }
}

Chúng tôi nhận được phản hồi sau:

"aggregations" : { "test" : { "doc_count_error_upper_bound" : 0, "sum_other_doc_count" : 0, "buckets" : [ { "key" : "Jour de fete", "doc_count" : 1 }, { "key" : "Jour de fête", "doc_count" : 1 }, { "key" : "Kirikou et la sorcière", "doc_count" : 1 }, { "key" : "La gloire de mon père", "doc_count" : 1 }, { "key" : "Le roi et l’oiseau", "doc_count" : 1 }, { "key" : "Señora Acero", "doc_count" : 1 }, { "key" : "Señora garçon", "doc_count" : 1 }, { "key" : "Être et avoir", "doc_count" : 1 } ] } }

Tạo các tập hợp không nhạy cảm với giọng bằng cách sử dụng bộ chuẩn hóa

Trong ví dụ trước, việc tổng hợp trả về hai nhóm khác nhau, một cho “Jour de fête” và một cho “Jour de fete”. Chúng tôi có thể kích hoạt tính năng tổng hợp để tạo một nhóm cho trường này, bất kể dấu phụ. Điều này đạt được bằng cách sử dụng bộ lọc chuẩn hóa.

Bộ chuẩn hóa hỗ trợ một tập hợp con các bộ lọc ký tự và mã thông báo. Chỉ sử dụng các giá trị mặc định, bộ lọc chuẩn hóa là một cách đơn giản để chuẩn hóa văn bản Unicode theo cách tìm kiếm không phụ thuộc vào ngôn ngữ, từ đó chuẩn hóa các dạng khác nhau của cùng một ký tự trong Unicode và cho phép tổng hợp dấu phụ-bất khả tri.

Hãy sửa đổi ánh xạ chỉ mục để bao gồm bộ chuẩn hóa. Xóa chỉ mục trước đó, sau đó tạo chỉ mục mới với ánh xạ sau và nhập cùng một tập dữ liệu:

PUT /asciifold_movies
{
  "settings": {
    "analysis": {
      "analyzer": {
        "custom_asciifolding": {
          "tokenizer": "standard",
          "filter": [
            "my_ascii_folding"
          ]
        }
      },
      "filter": {
        "my_ascii_folding": {
          "type": "asciifolding",
          "preserve_original": true
        }
      },
      "normalizer": {
        "custom_normalizer": {
          "type": "custom",
          "filter": "asciifolding"
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "custom_asciifolding",
        "fields": {
          "keyword": {
            "type": "keyword",
            "ignore_above": 256,
            "normalizer": "custom_normalizer"
          }
        }
      }
    }
  }
}

Sau khi bạn nhập cùng một tập dữ liệu, hãy thử truy vấn sau:

GET asciifold_movies/_search
{
  "size": 0,
  "aggs": {
    "test": {
      "terms": {
        "field": "title.keyword"
      }
    }
  }
}

Chúng tôi nhận được kết quả sau:

"aggregations" : {
    "test" : {
      "doc_count_error_upper_bound" : 0,
      "sum_other_doc_count" : 0,
      "buckets" : [
        {
          "key" : "Jour de fete",
          "doc_count" : 2
        },
        {
          "key" : "Etre et avoir",
          "doc_count" : 1
        },
        {
          "key" : "Kirikou et la sorciere",
          "doc_count" : 1
        },
        {
          "key" : "La gloire de mon pere",
          "doc_count" : 1
        },
        {
          "key" : "Le roi et l'oiseau",
          "doc_count" : 1
        },
        {
          "key" : "Senora Acero",
          "doc_count" : 1
        },
        {
          "key" : "Senora garcon",
          "doc_count" : 1
        }
      ]
    }
  }

Bây giờ, chúng ta so sánh kết quả và có thể thấy các tập hợp có thuật ngữ “Jour de fête” và “Jour de fete” được cuộn lại thành một nhóm với doc_count=2.

Tổng kết

Trong bài đăng này, chúng tôi đã trình bày cách bật tìm kiếm và tổng hợp không phân biệt dấu bằng cách thiết kế ánh xạ chỉ mục để thực hiện gấp ASCII cho mã thông báo tìm kiếm và chuẩn hóa trường từ khóa cho tổng hợp. Bạn có thể sử dụng DSL truy vấn OpenSearch để triển khai loạt tính năng tìm kiếm, cung cấp nền tảng linh hoạt cho các ứng dụng tìm kiếm có cấu trúc và không có cấu trúc. Cộng đồng OpenSearch mã nguồn mở cũng đã mở rộng sản phẩm để hỗ trợ xử lý ngôn ngữ tự nhiên, thuật toán học máy, từ điển tùy chỉnh và nhiều plugin khác.

Nếu bạn có phản hồi về bài đăng này, hãy gửi nó trong phần bình luận. Nếu bạn có câu hỏi về bài đăng này, hãy bắt đầu một chủ đề mới trên Diễn đàn dịch vụ tìm kiếm mở của Amazon or liên hệ với Bộ phận hỗ trợ AWS.


Lưu ý

Aruna Govindaraju là Kiến trúc sư giải pháp chuyên gia tìm kiếm mở của Amazon và đã làm việc với nhiều công cụ tìm kiếm thương mại và nguồn mở. Cô ấy đam mê tìm kiếm, mức độ liên quan và trải nghiệm người dùng. Chuyên môn của cô về mối tương quan giữa các tín hiệu của người dùng cuối với hành vi của công cụ tìm kiếm đã giúp nhiều khách hàng cải thiện trải nghiệm tìm kiếm của họ. Trò tiêu khiển yêu thích của cô là đi bộ trên những con đường mòn và ngọn núi ở New England.

tại chỗ_img

Tin tức mới nhất

tại chỗ_img