26/07/2019, 10:18

Một vài chú ý cho người mới sử dụng elasticsearch

1. Chú ý khi sử dụng analyzer Có lẽ khi làm việc với elasticsearch chúng ta đều đã ít nhiều từng nghe về analyzer, đây có thể được hiểu như là một công cụ của elasticsearch trong việc bẻ từ và cấu trúc dữ liệu giúp cho việc tìm kiếm text, khi chúng ta làm việc với text dưới các ngôn ngữ các khau. ...

1. Chú ý khi sử dụng analyzer

Có lẽ khi làm việc với elasticsearch chúng ta đều đã ít nhiều từng nghe về analyzer, đây có thể được hiểu như là một công cụ của elasticsearch trong việc bẻ từ và cấu trúc dữ liệu giúp cho việc tìm kiếm text, khi chúng ta làm việc với text dưới các ngôn ngữ các khau. Elasticsearch có hỗ trợ sẵn khá nhiều analyzer cho các ngôn ngữ khác nhau, tuy nhiên với tiếng việt thì chúng ta cần phải cài thêm plugin mới sử dụng được (vi_analyzer của anh duy đỗ). Mỗi analyzer bao gồm:

  • 0 or more CharFilters
  • 1 Tokenizer
  • 0 or more TokenFilters

chi tiết về các loại analyzer các bạn có thể tham khảo thêm tại đây. điều cần chú ý ở đây là mặc định elasticsearch sử dụng standard analyzer để phân tích text. Mọi thứ đều sẽ ổn cho đến khi giá trị search của bjan có chứa một và kí tự đặc biệt ví dụ như "C#". standard analyzer sẽ loại bỏ ký tự "#" (và một số ký tự đặc biệt khác) điều đó dẫn đến việc kết quả trà về của bạn sẽ khồng được như momg muốn. Giải pháp cho vấn đề này là tự tạo một analyzer của riêng mình. ví dụ như:

{
   "settings": {
      "analysis": {
         "tokenizer": {
            "custom_tokenizer": {
              "type": "ngram",
              token_chars: ["letter", "digit", "whitespace", "punctuation", "symbol")
            }
         },
         "analyzer": {
            "custom_analyzer": {
               "type": "custom",
               "filter": [
                  "lowercase"
               ],
               "tokenizer": "custom_tokenizer"
            }
         }
      }
   }
}

config cần chú ý ở đây là token_chars: Các lớp ký tự nên chứa trong một token, với giá trị "symbol" thì khi phân tích text elasticsearch sẽ không loại bỏ kí tự đặc biệt ( ví dụ kí tự "#") nữa. hoặc đơn giản hơn hãy sử dụng tokenizer whitespace nếu bạn cầ ntifm kiếm theo từ chứ không phải theo từng chữ             </div>
            
            <div class=

0