PINQ - Bộ dữ liệu được thẩm vấn. Tìm kiếm theo khía cạnh. Tìm đường dẫn đúng: điều hướng theo khía cạnh ảnh hưởng đến SEO như thế nào (bản dịch)

Tổ chức cái gọi là tìm kiếm theo khía cạnh (điều hướng theo khía cạnh) trên trang web. Ý nghĩa của nó là kết quả tìm kiếm có thể được tinh chỉnh bằng cách sử dụng nhiều đặc điểm khác nhau của tài liệu - tác giả, loại, thuật ngữ, ngày tạo, v.v.

Ví dụ: nếu bạn có một cửa hàng trực tuyến bán công nghệ điện tử, và người dùng nhập cụm từ vào tìm kiếm máy nghe nhạc. Trên trang kết quả, ngoài bản thân kết quả, sẽ có các khía cạnh:

- chương: thiết bị âm thanh (54), công nghệ máy tính (85)
- Thương hiệu: Apple (25), Samsung (68), iRiver (78)
- Tình trạng: Còn hàng: có (456), không (12)
- Giá: 100-1000$ (45), 1000-10000$ (12)

vân vân. Số lượng sản phẩm (nút) đáp ứng các đặc điểm này sẽ được chỉ định trong ngoặc. Bằng cách nhấp vào liên kết, người dùng sẽ thu hẹp kết quả tìm kiếm.


Một mặt, đây là giải pháp thay thế cho các bộ lọc mở rộng trong Chế độ xem, mặt khác, là giải pháp thay thế cho tìm kiếm nâng cao tiêu chuẩn.

Cài đặt

Phần khía cạnh

Trong phần này, bạn có thể chỉ định những khía cạnh nào sẽ được sử dụng khi tìm kiếm. Ví dụ: cho phép bạn chọn tài liệu theo phân loại, ngày thêm hoặc tác giả. Số lượng các khía cạnh phụ thuộc vào các mô-đun đi kèm.

Phần trang kết quả

Kiểu hiển thị- Kiểu hiển thị kết quả tìm kiếm: Chiết xuất có nghĩa là hiển thị như trong tìm kiếm thông thường (văn bản được đánh dấu, tác giả, ngày tháng); Đoạn giới thiệu có nghĩa là hiển thị đoạn giới thiệu tài liệu bằng cách sử dụng node.tpl.php thích hợp.

Sử dụng kiểu hiển thị Trích xuất một cách có chọn lọc- Nếu tùy chọn được chọn thì kiểu Chiết xuất sẽ luôn được áp dụng nếu từ khóa được nhập. Nếu bạn không chọn tùy chọn này, bạn có thể sử dụng mô-đun này để thay thế cho việc điều hướng các thuật ngữ phân loại.

Phần tìm kiếm hiện tại

Cho phép bạn bật khối Tìm kiếm hiện tại , hiển thị các cụm từ tìm kiếm:

Trong bài viết hôm nay, tôi sẽ cho bạn biết về tính năng Sphinx được gọi là nhiều truy vấn: các tính năng tối ưu hóa tích hợp, triển khai, v.v. tìm kiếm theo khía cạnh và nói chung đôi khi bạn có thể sử dụng nó để thực hiện tìm kiếm nhanh hơn ba lần.

Nhưng trước tiên, 15 giây thông tin chính trị (bạn không thể tự khen mình, sẽ không có ai khen bạn cả). Năm nay, Sphinx đủ tiêu chuẩn trong danh mục Quản trị viên hệ thống và Doanh nghiệp (họ nói rằng nó chỉ bỏ sót một chút trong danh mục Nhà phát triển). Việc bỏ phiếu sẽ tiếp tục trong một tuần nữa (cho đến ngày 20). Trừ người công nhân địa chỉ email, không cần gì cả. Cảm ơn trước tất cả những người sẽ không để chúng tôi lãng phí!

Và quay lại phát triển. Dù sao, nhiều yêu cầu là gì và tốc độ nhanh gấp ba lần được hứa hẹn đến từ đâu?

Nhiều truy vấn là cơ chế cho phép bạn gửi nhiều yêu cầu tìm kiếm trong một gói.

Các phương thức API triển khai cơ chế đa yêu cầu được gọi là ThêmQuery()RunQueries(). (Nhân tiện, phương thức Query() “thông thường” sử dụng chúng trong nội bộ: nó gọi AddQuery() một lần và sau đó ngay lập tức RunQueries()). Phương thức AddQuery() lưu trạng thái hiện tại của tất cả cài đặt truy vấn do lệnh gọi API trước đó đặt và ghi nhớ truy vấn. Cài đặt của một yêu cầu đã được ghi nhớ sẽ không còn thay đổi, mọi lệnh gọi API sẽ không chạm vào chúng, vì vậy, đối với các yêu cầu tiếp theo, bạn có thể sử dụng bất kỳ cài đặt nào khác (chế độ sắp xếp khác, các bộ lọc khác, v.v.). Phương thức RunQueries() thực sự gửi tất cả các truy vấn được lưu trữ trong một đợt và trả về nhiều kết quả. Không có hạn chế nào được áp đặt đối với các yêu cầu tham gia gói. Số lượng truy vấn, đề phòng, bị giới hạn bởi chỉ thị max_batch_queries (được thêm vào 0.9.10, trước đây được sửa ở mức 32), nhưng đây thường chỉ là kiểm tra các gói bị hỏng.

Tại sao nên sử dụng nhiều truy vấn? Nói chung, tất cả phụ thuộc vào hiệu suất. Thứ nhất, bằng cách gửi yêu cầu tới searchd trong một gói, chúng tôi luôn tiết kiệm được một ít tài nguyên và thời gian bằng cách gửi đi gửi lại ít gói mạng hơn. Thứ hai, và quan trọng hơn nhiều, searchd có cơ hội thực hiện một số tối ưu hóa trên toàn bộ loạt truy vấn. Theo thời gian, các tối ưu hóa mới dần dần được thêm vào, do đó, việc gửi yêu cầu theo đợt bất cứ khi nào có thể là điều hợp lý - sau đó khi bạn cập nhật Sphinx, các tính năng mới sẽ tối ưu hóa hàng loạt bật hoàn toàn tự động. Trong trường hợp không thể áp dụng tối ưu hóa hàng loạt, các yêu cầu sẽ chỉ được xử lý từng yêu cầu một mà không có bất kỳ sự khác biệt rõ ràng nào đối với ứng dụng.

Tại sao (chính xác hơn là khi nào) KHÔNG sử dụng nhiều truy vấn? Tất cả các truy vấn trong một đợt phải độc lập, nhưng đôi khi trường hợp này không xảy ra và truy vấn B có thể phụ thuộc vào kết quả của truy vấn A. Ví dụ: chúng tôi có thể muốn hiển thị kết quả tìm kiếm từ chỉ số bổ sung chỉ khi không tìm thấy gì trong chỉ mục chính. Hoặc đơn giản là chọn một offset khác trong tập kết quả thứ 2 tùy thuộc vào số lượng trận đấu trong tập đầu tiên. Trong những trường hợp như vậy bạn sẽ phải sử dụng yêu cầu cá nhân(hoặc gói riêng).

Có hai tối ưu hóa hàng loạt quan trọng đáng để biết: tối ưu hóa thắc mắc chung(có sẵn từ phiên bản 0.9.8) và tối ưu hóa các cây con phổ biến (có sẵn từ phiên bản 0.9.10, đang được phát triển).

Tối ưu hóa truy vấn chung nó hoạt động như thế này searchd chọn từ gói tất cả các yêu cầu mà chỉ có cài đặt sắp xếp và nhóm khác nhau, nhưng phần toàn văn, bộ lọc, v.v. đều giống nhau - và chỉ tìm kiếm một lần. Ví dụ: nếu có 3 truy vấn trong một gói thì phần văn bản của tất cả chúng đều là “ipod nano”, nhưng truy vấn đầu tiên chọn 10 kết quả rẻ nhất, truy vấn thứ 2 nhóm kết quả theo ID cửa hàng và sắp xếp các cửa hàng theo xếp hạng, và truy vấn thứ 3 chỉ cần chọn mức giá tối đa, tìm kiếm “ipod nano” » sẽ chỉ hoạt động một lần, nhưng từ kết quả của nó, 3 phản hồi được sắp xếp và nhóm khác nhau sẽ được tạo.

Cái gọi là tìm kiếm khía cạnh là trường hợp đặc biệt được áp dụng sự tối ưu hóa này. Trên thực tế, nó có thể được triển khai bằng cách chạy một số truy vấn tìm kiếm với cài đặt khác nhau: một cho các kết quả tìm kiếm chính, một số khác cho cùng một truy vấn tìm kiếm, nhưng cài đặt nhóm khác nhau (3 tác giả hàng đầu, 5 cửa hàng hàng đầu, v.v.). Khi mọi thứ ngoại trừ việc sắp xếp và nhóm đều giống nhau, tính năng tối ưu hóa được bật và tốc độ tăng lên khá tốt (ví dụ bên dưới).

Tối ưu hóa cây con được chia sẻđiều thú vị hơn nữa. Nó cho phép searchd khai thác những điểm tương đồng giữa các truy vấn khác nhau trong một đợt. Bên trong tất cả những người đến đều riêng biệt - khác nhau! - truy vấn toàn văn xác định các phần chung và nếu có, kết quả trung gian các tính toán được lưu trữ và chia sẻ giữa các yêu cầu. Ví dụ: trong gói 3 yêu cầu này

Barack Obama Tổng thống Barack Obama John Mccain Bài phát biểu của Barack Obama

Có một phần chung của 2 từ (“barack obama”), có thể tính toán chính xác một lần cho cả ba truy vấn và được lưu vào bộ nhớ đệm. Đây chính xác là những gì tối ưu hóa cây con được chia sẻ thực hiện. Kích thước bộ đệm tối đa cho mỗi lô bị giới hạn nghiêm ngặt bởi các chỉ thị subtree_docs_cache và subtree_hits_cache, vì vậy nếu phần chung “tôi” được tìm thấy trong một trăm triệu tài liệu, máy chủ sẽ không đột ngột hết bộ nhớ.

Hãy quay lại việc tối ưu hóa các truy vấn chung. Đây là một ví dụ về mã chạy cùng một truy vấn nhưng có ba chế độ khác nhau sắp xếp:
các chế độ sắp xếp:

Yêu cầu("sphinxapi.php"); $cl = SphinxClient mới(); $cl->SetMatchMode(SPH_MATCH_EXTENDED2); $cl->SetSortMode(SPH_SORT_RELEVANCE); $cl->AddQuery("the", "lj"); $cl->SetSortMode(SPH_SORT_EXTENDED, "đã xuất bản"); $cl->AddQuery("the", "lj"); $cl->SetSortMode(SPH_SORT_EXTENDED, "đã xuất bản tăng dần"); $cl->AddQuery("the", "lj"); $res = $cl->RunQueries();

Làm thế nào để bạn biết liệu việc tối ưu hóa có hiệu quả hay không? Nếu nó hoạt động, trong các dòng tương ứng của nhật ký sẽ có một trường có “số nhân”, cho biết có bao nhiêu yêu cầu được xử lý cùng nhau:

0,040 giây x3 0,040 giây x3 0,040 giây x3

Hãy chú ý đến “x3”, chính xác là như vậy - điều đó có nghĩa là yêu cầu đã được tối ưu hóa và xử lý như một phần của gói gồm 3 yêu cầu (bao gồm cả yêu cầu này). Để so sánh, nhật ký trông như thế này, trong đó các yêu cầu giống nhau được gửi cùng một lúc:

0,059 giây 0,091 giây 0,092 giây

Có thể thấy, thời gian tìm kiếm cho mỗi truy vấn trong trường hợp đa truy vấn đã được cải thiện từ 1,5 lên 2,3 lần, tùy theo chế độ sắp xếp. Trên thực tế, đây không phải là giới hạn. Đối với cả hai lần tối ưu hóa, có những trường hợp đã biết tốc độ được cải thiện từ 3 lần trở lên - không phải trong các thử nghiệm tổng hợp mà là trong quá trình sản xuất. Việc tối ưu hóa các truy vấn chung khá phù hợp với các tìm kiếm dọc cho sản phẩm và cửa hàng trực tuyến, bộ nhớ đệm của các cây con chung và cả các truy vấn khai thác dữ liệu; nhưng tất nhiên, khả năng ứng dụng không bị giới hạn nghiêm ngặt ở những lĩnh vực này. Ví dụ: bạn có thể thực hiện tìm kiếm mà không cần phần văn bản đầy đủ và đọc một số báo cáo khác nhau (với cách sắp xếp, nhóm khác nhau, v.v.) bằng cách sử dụng cùng một dữ liệu trong một yêu cầu.

Chúng ta có thể mong đợi những tối ưu hóa nào khác trong tương lai? Phụ thuộc vào bạn. Cho đến nay, kế hoạch dài hạn bao gồm việc tối ưu hóa rõ ràng cho các truy vấn giống hệt nhau với các bộ bộ lọc khác nhau. Bạn có biết một mẫu phổ biến khác có thể được tối ưu hóa một cách khéo léo không? Gửi nó!

Chúng ta đã xem nhanh cách cài đặt và cú pháp cơ bản của PINQ, một cổng chuyển từ LINQ sang PHP. Trong bài viết này, chúng ta sẽ xem xét cách sử dụng PINQ để mô phỏng tính năng tìm kiếm theo khía cạnh trong MySQL.

Trong bài viết này, chúng tôi sẽ không đề cập đến tất cả các khía cạnh của tìm kiếm theo khía cạnh. Mọi người quan tâm có thể tìm kiếm thông tin phù hợp trên mạng.

Tìm kiếm theo khía cạnh điển hình hoạt động như thế này:

  • Người dùng nhập một từ khóa hoặc nhiều từ khóa để tìm kiếm. Ví dụ: “router” để tìm kiếm các sản phẩm có từ “router” xuất hiện trong phần mô tả, từ khóa, tên danh mục, thẻ, v.v.
  • Trang web trả về danh sách các sản phẩm phù hợp với các tiêu chí này.
  • Trang web cung cấp một số liên kết để tùy chỉnh cụm từ tìm kiếm của bạn. Ví dụ: nó có thể cho phép bạn chỉ định nhà sản xuất bộ định tuyến cụ thể hoặc đặt phạm vi giá hoặc các tính năng khác.
  • Người dùng có thể tiếp tục chỉ định tiêu chí bổ sung tìm kiếm để có được tập dữ liệu quan tâm.

Tìm kiếm theo khía cạnh rất phổ biến và là công cụ đắc lực, nó có thể được quan sát thấy trên hầu hết mọi trang web liên quan đến thương mại điện tử.

Thật không may, tìm kiếm theo khía cạnh không được tích hợp vào MySQL. Vậy chúng ta nên làm gì nếu vẫn sử dụng MySQL nhưng muốn mang đến cho người dùng cơ hội này?

Với PINQ, có cách tiếp cận tương tự, mạnh mẽ và đơn giản, chúng tôi có thể đạt được hành vi tương tự như khi chúng tôi sử dụng các công cụ cơ sở dữ liệu khác.

Mở rộng bản demo từ phần đầu tiên

Bình luận: Tất cả mã từ phần này và từ phần đầu tiên đều có thể được tìm thấy trong kho lưu trữ.

Trong bài viết này, chúng tôi sẽ mở rộng bản demo từ Phần 1 với cải tiến đáng kể về hình thức tìm kiếm thuộc tính.

Hãy bắt đầu với index.php bằng cách thêm dòng sau:

$app->get("demo2", function () sử dụng ($app) ( toàn cầu $demo; $test2 = new pinqDemo\Demo($app); return $test2->test2($app, $demo->test1 ($ứng dụng)); )); $app->get("demo2/facet/(key)/(value)", function ($key, $value) sử dụng ($app) ( toàn cầu $demo; $test3 = new pinqDemo\Demo($app); return $test3->test3($app, $demo->test1($app), $key, $value); ));

Lộ trình đầu tiên đưa chúng ta đến một trang để xem tất cả các bài viết phù hợp với từ khóa tìm kiếm. Để ví dụ đơn giản, chúng ta chọn tất cả sách từ bảng book_book. Nó cũng sẽ hiển thị tập dữ liệu kết quả và một tập hợp các liên kết để chỉ định tiêu chí tìm kiếm.

TRONG ứng dụng thực tế, sau khi nhấp vào các liên kết như vậy, tất cả các bộ lọc khía cạnh sẽ điều chỉnh theo các giá trị biên của tập dữ liệu kết quả. Do đó, người dùng sẽ có thể thêm tuần tự các điều kiện tìm kiếm mới, ví dụ: trước tiên hãy chọn nhà sản xuất, sau đó chỉ định phạm vi giá, v.v.

Nhưng trong ví dụ này, chúng tôi sẽ không triển khai hành vi này - tất cả các bộ lọc sẽ phản ánh các giá trị biên của tập dữ liệu gốc. Đây là hạn chế đầu tiên và là ứng cử viên đầu tiên để cải thiện bản demo của chúng tôi.

Như bạn có thể thấy trong đoạn mã trên, các hàm thực tế được đặt trong một tệp khác có tên pinqDemo.php. Chúng ta hãy xem mã tương ứng cung cấp tính năng tìm kiếm theo khía cạnh.

Lớp khía cạnh

Bước đầu tiên là tạo một lớp đại diện cho một khía cạnh. Nói chung, một khía cạnh nên chứa một số thuộc tính:

  • Dữ liệu nó hoạt động trên ( dữ liệu $)
  • Chìa khóa để thực hiện việc nhóm ( phím $)
  • Loại khóa ($loại). Có thể là một trong những điều sau đây:
    • chỉ định chuỗi đầy đủ cho một kết quả khớp chính xác
    • chỉ ra một phần của chuỗi (thường là phần đầu tiên) để tìm kiếm theo mẫu
    • chỉ ra một phạm vi giá trị, để nhóm theo phạm vi
  • nếu loại khóa là một phạm vi giá trị, bạn cần xác định bước giá trị để xác định giới hạn dưới và giới hạn trên của phạm vi; hoặc nếu loại này là một phần của chuỗi, bạn phải chỉ định số lượng chữ cái đầu tiên sẽ được sử dụng để nhóm ($range)

Nhóm- phần quan trọng nhất của khía cạnh. Tất cả thông tin tổng hợp mà một khía cạnh có thể trả về tùy thuộc vào tiêu chí nhóm. Thông thường, tiêu chí tìm kiếm được sử dụng nhiều nhất là “Chuỗi đầy đủ”, “Một phần của chuỗi” hoặc “Phạm vi giá trị”.

Không gian tên classFacet ( use Pinq\ITraversable, Pinq\Traversable; class Facet ( public $data; // Tập dữ liệu gốc public $key; // trường để nhóm public $type; // F: toàn bộ hàng; S: chuỗi bắt đầu ; R: phạm vi; public $range; // chỉ đóng vai trò nếu $type != F ... public function getFacet() ( $filter = ""; if ($this->type == "F") / / toàn bộ dòng ( ... ) elseif ($this->type == "S") // bắt đầu dòng ( ... ) elseif ($this->type == "R") // phạm vi giá trị ​​( $ filter = $this->data ->groupBy(function($row) ( return sàn($row[$this->key] / $this->range) * $this->range; )) -> select(function (ITraversable $data) ( return ["key" => $data->last()[$this->key], "count" => $data->count()]; )); ) return $bộ lọc; ) ) )

Chức năng chính của lớp này là trả về một tập dữ liệu đã được lọc dựa trên tập dữ liệu gốc và các thuộc tính khía cạnh. Từ mã rõ ràng là đối với nhiều loại khác nhau tài khoản được sử dụng nhiều cách khác nhau phân nhóm dữ liệu. Trong đoạn mã trên, chúng tôi đã cho thấy mã có thể trông như thế nào nếu chúng tôi nhóm dữ liệu theo một phạm vi giá trị theo gia số được chỉ định trong phạm vi $.

Đặt các khía cạnh và hiển thị dữ liệu nguồn

Hàm công khai test2($app, $data) ( $facet = $this->getFacet($data); return $app["twig"]->render("demo2.html.twig", array("facet" = > $facet, "data" => $data)); ) hàm riêng getFacet($originData) ( $facet = array(); $data = \Pinq\Traversable::from($originData); // 3 ví dụ tạo các đồ vật khác nhau các khía cạnh và trả về các khía cạnh $filter1 = new \classFacet\Facet($data, "author", "F"); $filter2 = new \classFacet\Facet($data, "title", "S", 6); $filter3 = new \classFacet\Facet($data, "price", "R", 10); $facet[$filter1->key] = $filter1->getFacet(); $facet[$filter2->key] = $filter2->getFacet(); $facet[$filter3->key] = $filter3->getFacet(); trả về $facet; )

Trong phương thức getFacet() chúng ta thực hiện như sau:

  • Chuyển đổi dữ liệu gốc thành đối tượng Pinq\Traversable để xử lý tiếp
  • Chúng tôi tạo ra ba khía cạnh. Khía cạnh 'tác giả' sẽ nhóm theo trường tác giả và triển khai nhóm theo toàn bộ hàng; khía cạnh 'tiêu đề' - theo trường tiêu đề với việc nhóm theo một phần của dòng (theo 6 ký tự đầu tiên); khía cạnh 'giá' - theo trường giá với việc nhóm theo phạm vi (với bước tăng 10)
  • Cuối cùng, chúng tôi trích xuất các khía cạnh và trả chúng về hàm test2 để chúng có thể xuất ra mẫu để hiển thị

Xuất các khía cạnh và dữ liệu được lọc

Trong hầu hết các trường hợp, bộ lọc sẽ được hiển thị dưới dạng một dòng và sẽ dẫn bạn đến xem kết quả đã lọc.

Chúng tôi đã tạo một lộ trình ("demo2/facet/(key)/(value)") để hiển thị các kết quả tìm kiếm theo khía cạnh và liên kết bộ lọc.

Tuyến đường có hai tham số, tùy thuộc vào khóa được lọc và giá trị của khóa đó. Hàm test3 được liên kết với tuyến đường này được hiển thị bên dưới:

Hàm công khai test3($app, $originData, $key, $value) ( ​​$data = \Pinq\Traversable::from($originData); $facet = $this->getFacet($data); $filter = null; if ($key == "tác giả") ( $filter = $data ->where(function($row) use ($value) ( ​​​​return $row["author"] == $value; )) ->orderByAscending( function($row) use ($key) ( return $row["price"]; )) ; ) elseif ($key == "price") ( ... ) else //$key== tiêu đề ( .. . ) return $app["twig"]->render("demo2.html.twig", array("facet" => $facet, "data" => $filter)); )

Về cơ bản, tùy thuộc vào khóa, chúng tôi áp dụng tính năng lọc (một hàm ẩn danh trong câu lệnh Where) theo giá trị được truyền và nhận được bộ dữ liệu được lọc sau đây. Chúng ta cũng có thể thiết lập thứ tự lọc dữ liệu.

Cuối cùng, chúng tôi hiển thị dữ liệu thô (cùng với các bộ lọc) trong mẫu. Tuyến đường này sử dụng cùng một mẫu mà chúng tôi đã sử dụng trong "demo2".

Thanh tìm kiếm

    (% cho k, v ở khía cạnh %)
  • ((k|viết hoa))
    • (% cho vv trong v %)
    • ((vv.count))((vv.key))
    • (%endfor%)
    (%endfor%)

Chúng ta cần nhớ rằng các khía cạnh do ứng dụng của chúng ta tạo ra là các mảng lồng nhau. Ở cấp độ đầu tiên, đây là một mảng gồm tất cả các khía cạnh và trong trường hợp của chúng tôi, có ba khía cạnh trong số đó (tương ứng với tác giả, tiêu đề, giá cả).

Mỗi khía cạnh có một mảng khóa-giá trị, vì vậy chúng ta có thể lặp lại nó bằng các phương thức thông thường.

Lưu ý cách chúng tôi xây dựng URL cho các liên kết của mình. Chúng tôi sử dụng cả khóa vòng lặp bên ngoài (k) và khóa vòng lặp bên trong (vv.key) làm tham số cho tuyến đường ("demo2/facet/(key)/(value)"). Kích thước của mảng (vv.count) được sử dụng để hiển thị trong mẫu.

Hình ảnh đầu tiên hiển thị tập dữ liệu gốc và hình ảnh thứ hai được lọc theo phạm vi giá từ 0 USD đến 10 USD và được sắp xếp theo tác giả.

Tuyệt vời, chúng tôi đã có thể mô phỏng tìm kiếm theo khía cạnh trong ứng dụng của mình!

Trước khi kết thúc bài viết này, chúng ta cần xem lại ví dụ của mình lần cuối và xác định những gì có thể cải thiện cũng như những hạn chế mà chúng ta có.

Những cải tiến có thể có

Nói chung là rất ví dụ cơ bản. Chúng tôi vừa đi qua cú pháp cơ bản và các khái niệm và thực hiện chúng như một ví dụ hoạt động. Như đã nêu trước đây, chúng tôi có một số lĩnh vực có thể được cải thiện để linh hoạt hơn.

Chúng tôi cần triển khai tiêu chí tìm kiếm "lớp phủ", vì ví dụ hiện tại giới hạn khả năng của chúng tôi chỉ áp dụng lọc tìm kiếm cho tập dữ liệu gốc; chúng tôi không thể áp dụng tìm kiếm theo khía cạnh cho kết quả đã được lọc. Đây là cải tiến lớn nhất mà tôi có thể tưởng tượng.

Những hạn chế

Tìm kiếm thuộc tính được triển khai trong bài viết này có những hạn chế nghiêm trọng (điều này cũng có thể áp dụng cho các triển khai tìm kiếm thuộc tính khác):

Chúng tôi luôn tìm nạp dữ liệu từ MySQL

Ứng dụng này sử dụng khung Silex. Giống như bất kỳ khung điểm nhập duy nhất nào như Silex, Symfony, Laravel, tệp index.php (hoặc app.php) của nó được gọi mỗi khi một tuyến được phân tích cú pháp và các hàm điều khiển được thực thi.

Nếu bạn nhìn vào mã trong index.php của chúng tôi, bạn sẽ nhận thấy dòng mã sau:

$demo = pinqDemo\Demo($app); mới

được gọi mỗi khi trang ứng dụng được hiển thị, có nghĩa là các dòng mã sau được thực thi mỗi lần:

Bản trình diễn lớp ( Private $books = ""; public function __construct($app) ( $sql = "select * from book_book order by id"; $this->books = $app["db"]->fetchAll($sql ); )

Sẽ tốt hơn nếu chúng ta không sử dụng framework? Chà, mặc dù thực tế là việc phát triển ứng dụng mà không có framework không phải là một ý tưởng hay, nhưng tôi có thể nói rằng chúng ta sẽ gặp phải những vấn đề tương tự: dữ liệu (và trạng thái) không được lưu giữa các nền tảng khác nhau. Yêu cầu HTTP. Đây là một đặc điểm cơ bản của HTTP. Điều này có thể tránh được bằng cách sử dụng cơ chế lưu vào bộ nhớ đệm.

Chúng tôi đã lưu một số truy vấn SQL bằng cách sử dụng các khía cạnh. Thay vì chuyển một truy vấn chọn để truy xuất dữ liệu và ba nhóm theo truy vấn có mệnh đề Where tương ứng, chúng tôi chỉ chạy một truy vấn Where và sử dụng PINQ để lấy thông tin tổng hợp.

Phần kết luận

Trong phần này, chúng tôi đã triển khai khả năng tìm kiếm theo khía cạnh một bộ sưu tập sách. Như tôi đã nói, đây chỉ là một ví dụ nhỏ, có thể cải thiện nhưng vẫn còn một số hạn chế.

Điều hướng theo khía cạnh - đây là loại cấu trúc trang web trong đó người dùng có cơ hội chỉ định các khía cạnh khác nhau (thông số mong muốn) để tìm sản phẩm hoặc dịch vụ mà họ đang tìm kiếm.

Điều này cho phép khách truy cập cửa hàng trực tuyến dễ dàng điều hướng qua nhiều loại sản phẩm hoặc dịch vụ được cung cấp, nhanh chóng đến được thứ họ đang tìm kiếm. Chỉ trong trường hợp này, mỗi người dùng sẽ tìm kiếm theo con đường riêng của mình.

Cách tốt nhất để chứng minh nguyên tắc điều hướng theo khía cạnh là bằng một ví dụ cụ thể.

Ví dụ, bạn định mua điện thoại di động trong cửa hàng trực tuyến. Bạn có muốn tìm số điện thoại không? một mô hình nhất định, màu sắc, giá cả, thương hiệu. Sẽ dễ dàng hơn và nhanh hơn để tìm thấy những gì bạn cần bằng cách thu hẹp tìm kiếm bằng cách sử dụng một số hoặc tất cả các tham số (các khía cạnh).

Tính linh hoạt của cấu trúc trang web cho phép bạn dễ dàng tạo trang đích cho các từ khóa riêng lẻ. Điều này có vẻ đơn giản trên giấy tờ. Trong thực tế, mọi thứ phức tạp hơn nhiều.

Hãy xem xét những câu hỏi khó chính.

1. Cần bao nhiêu khía cạnh để trang web của bạn được lập chỉ mục tốt?

Lý tưởng nhất là “độ sâu” của một khía cạnh không được vượt quá 100 mục. Điều này sẽ cho phép robot tìm kiếm lập chỉ mục tất cả các trang của tài nguyên. Hầu hết các chuyên gia quảng bá trang web đều có xu hướng tin rằng robot tìm kiếm có thể nhận ra hơn 100 liên kết trên một trang.

Tốt nhất nên tuân theo quan điểm sau: Vì hầu hết các trang web đều có liên kết điều hướng trên mỗi trang nên số lượng liên kết sản phẩm trên mỗi trang trang riêng không được vượt quá 100.

2. Các khía cạnh và bộ lọc tìm kiếm

Có thể có các tùy chọn trên trang web của bạn mà bạn muốn cung cấp cho khách truy cập, nhưng điều đó không quan trọng từ góc độ tối ưu hóa công cụ tìm kiếm. Ví dụ: rất thuận tiện cho du khách lựa chọn sản phẩm bằng cách Đúng kích cỡ và bạn có thể không thực sự quan tâm đến việc lập chỉ mục trang tài nguyên cụ thể này. Trong trường hợp này, hãy sử dụng bộ lọc với sử dụng Java Tập lệnh và chặn lập chỉ mục một số trang nội bộ nhất định.

3. Sắp xếp

Bạn có thể muốn bao gồm Tùy chọn bổ sung sự lựa chọn (ví dụ: giá của sản phẩm, mức độ phổ biến của nó, v.v.). Tất nhiên, điều này rất thuận tiện cho khách hàng nhưng lại có nguy cơ trùng lặp nội dung. Nếu bạn không muốn công cụ tìm kiếm lập chỉ mục một trang nhiều lần do có các đường dẫn điều hướng khác nhau, hãy sử dụng JavaScript hoặc Ajax.

4. Vấn đề trùng lặp nội dung

Với cấu trúc trang web theo nhiều khía cạnh, vấn đề trùng lặp nội dung phát sinh do sự hiện diện của các đường dẫn điều hướng khác nhau trên cùng một trang. Và nếu bạn không cẩn thận về vấn đề này, bạn sẽ có cùng một nội dung trên nhiều trang.

Đường dẫn điều hướng mà khách truy cập sử dụng để tìm một sản phẩm cụ thể không quan trọng. Điều quan trọng là chỉ một trong các đường dẫn được lập chỉ mục. Để làm điều này, hãy sử dụng CMS. Nếu không, cùng một trang sẽ được lập chỉ mục nhiều lần.

Và một lần nữa về sự độc đáo của nội dung...

Giả sử bạn đã tạo một điều hướng theo khía cạnh hợp lý, các trang có liên quan cho từng từ khóa hoặc cụm từ, nhưng bất chấp tất cả những điều này, trang web của bạn vẫn chứa nhiều trang tương tự, nội dung của các trang đó là danh sách sản phẩm. Vì vậy mỗi trang phải có một trang riêng Nội dung độc đáo và trang càng quan trọng thì nội dung của nó càng có chỉ số duy nhất cao.

Vì vậy, đây là những gì cần nhớ:

  1. tạo nhiều khía cạnh cần thiết để đặt không quá 100 sản phẩm trên một trang;
  2. đảm bảo rằng đối với mỗi cụm từ khoá, mà bạn muốn xếp hạng trong công cụ tìm kiếm, sẽ có trang đích riêng;
  3. sắp xếp không chính xác có thể dẫn đến trùng lặp nội dung, để tránh điều này hãy sử dụng Ajax và Java Script để đóng một số nội dung trang nội bộ từ việc lập chỉ mục;
  4. bất kể người dùng sử dụng đường dẫn điều hướng nào để tìm một trang cụ thể, chỉ nên lập chỉ mục một trang;
  5. đừng quên: nội dung thông tin phải thú vị và hấp dẫn hơn.

Các chuyên gia nổi tiếng thế giới trong lĩnh vực khả năng sử dụng và UX. Cứ vài năm họ lại nghiên cứu sự thành công của tìm kiếm trên các trang web thương mại điện tử và chia sẻ kết quả trên blog của họ. Nghiên cứu cuối cùng được thực hiện vào năm 2017. Đặc biệt đối với bạn, chúng tôi đã đọc bài viết kèm theo mô tả, dịch nó và đưa ra những kết luận thực tế sẽ giúp bạn cải thiện khả năng tìm kiếm trên trang web của riêng mình.

Thuật toán tìm kiếm

Hỗ trợ toán tử tìm kiếm nâng cao "trích dẫn"

NNGroup viết rằng hầu hết khách truy cập vào các cửa hàng trực tuyến không biết cách sử dụng các toán tử tìm kiếm nâng cao. Nếu họ muốn tìm đồ chơi cho mèo, họ sẽ không tìm kiếm “mèo VÀ đồ chơi” để xem tất cả các sản phẩm có cả hai từ khóa trong mô tả. Vì vậy, không cần thiết phải hỗ trợ các truy vấn tìm kiếm phức tạp như vậy.

Dấu ngoặc kép là ngoại lệ duy nhất. Nếu bạn đặt một cụm từ trong dấu ngoặc kép, việc tìm kiếm sẽ dựa trên kết quả khớp hoàn toàn với cụm từ đó. Toán tử này được sử dụng trong tìm kiếm của Google, và được biết đến rộng rãi trong số những người dùng Internet tiên tiến.

Tự động sắp xếp kết quả tìm kiếm theo mức độ phù hợp với truy vấn của bạn

TRONG kết quả tìm kiếm Những sản phẩm đáp ứng tất cả hoặc hầu hết các từ khóa truy vấn sẽ được hiển thị trước tiên.

Ví dụ. Trong các nghiên cứu trước đây, người dùng trang web The Container Store đã phàn nàn về kết quả tìm kiếm không chính xác trên trang web. Một người dùng muốn mua một bộ hộp đựng bằng thép không gỉ có nắp trong suốt. Khi yêu cầu “hộp thép thủy tinh”, anh nhận được bàn chải nhà vệ sinh và lọ thủy tinh. Người dùng đã phải định dạng lại truy vấn tìm kiếm nhiều lần nhưng không thành công.

Vấn đề máy tìm kiếm trên trang web là kết quả tìm kiếm hiển thị tất cả các sản phẩm khớp với ít nhất một từ tìm kiếm (“thép”, “thủy tinh” hoặc “hộp đựng”), không được sắp xếp theo mức độ khớp với yêu cầu ban đầu. Sản phẩm phù hợp với cả ba từ khóa, có thể ở bất kỳ đâu trong danh sách, không nhất thiết phải ở đầu. Trang web sau đó đã được cập nhật thuật toán tìm kiếm: Bây giờ ở đầu kết quả tìm kiếm, bạn có thể thấy các sản phẩm khớp với tất cả hoặc hầu hết các từ khóa truy vấn.

Cải thiện kết quả tìm kiếm trên containerstore.com: kết quả đầu tiên về hộp đựng bằng thép và thủy tinh phù hợp với nhu cầu của người dùng

Khi sắp xếp kết quả theo xếp hạng sản phẩm, hãy xem xét giá trị có trọng số chứ không phải giá trị trung bình.

Bằng cách sắp xếp sản phẩm theo xếp hạng trung bình của khách hàng, người dùng không muốn thấy sản phẩm chỉ có một xếp hạng, ngay cả khi đó là 5 sao. Mọi người không muốn tình cờ thấy một bài đánh giá tùy chỉnh và xếp hạng trung bình của một sản phẩm dựa trên một vài bài đánh giá khiến họ nghi ngờ. Khi sắp xếp theo xếp hạng có trọng số, sản phẩm có xếp hạng trung bình là 4,9/5 và 342 đánh giá sẽ được xếp hạng cao hơn sản phẩm có xếp hạng trung bình là 5/5 và 3 đánh giá. Bằng cách này, người dùng sẽ có thể có được ý tưởng khách quan về mức độ phổ biến và chất lượng của sản phẩm.

Thiết kế và vị trí của thanh tìm kiếm

Hiển thị thanh tìm kiếm trong một khối với menu điều hướng trong tiêu đề trang web

Cách sắp xếp thanh tìm kiếm này được tìm thấy trên nhiều trang web, vì vậy người dùng đã biết phải tìm nó ở đâu. Ngoài ra, hiển thị chuỗi tìm kiếm trong một khối với Chức năng điều hướng giải quyết nhiều vấn đề, chẳng hạn như sự vắng mặt của nó trên một số trang của trang web và nhu cầu lặp lại nó trên trang kết quả tìm kiếm.

Trên trang web Wildberries, nó lớn và hiển thị rõ ràng chuỗi tìm kiếm nằm ngay trong tiêu đề trang web

Hiển thị thanh tìm kiếm và biểu tượng kính lúp trên màn hình

Khi khách truy cập vào các trang mua sắm trực tuyến muốn sử dụng tìm kiếm, họ sẽ tìm kiếm một trường trống rộng hoặc biểu tượng kính lúp. Đồng thời, không cần thiết phải ký rõ ràng vào chuỗi tìm kiếm và gọi nó là “Tìm kiếm”, mặc dù điều đó sẽ không gây hại gì.

Nhiều trang web trong phiên bản dành cho điện thoại thông minh sử dụng thành công biểu tượng kính lúp và không hiển thị dòng đó, điều này cho phép chúng tiết kiệm không gian trên màn hình. Nhưng nếu doanh số bán trang web của bạn phụ thuộc vào tìm kiếm thì tốt hơn hết bạn nên hiển thị thanh tìm kiếm ngay lập tức, ngay cả trên màn hình nhỏ. Điều này đặc biệt đúng đối với các phiên bản PC của trang web, nơi có quá nhiều không gian màn hình. Sử dụng trường trống có nút “Tìm” hoặc biểu tượng kính lúp. Trường này sẽ hiển thị trên mỗi trang.

Thu hẹp kết quả tìm kiếm của bạn

Không sử dụng tìm kiếm nâng cao hoặc tìm kiếm danh mục trừ khi bạn là Amazon

Trước đây, nhiều cửa hàng trực tuyến đã sử dụng tính năng tìm kiếm nâng cao và tìm kiếm danh mục để giúp người dùng thu hẹp số lượng mặt hàng trong kết quả tìm kiếm của họ. Tuy nhiên, mọi người không thực sự sử dụng tìm kiếm nâng cao và thường bị nhầm lẫn khi tìm kiếm theo danh mục, vì vậy những tính năng này đã dần lỗi thời.

Các phương pháp tìm kiếm nâng cao như vậy hiện chỉ khả dụng trên những trang web mà chúng thực sự hữu ích. Đây là những trang web có các kịch bản tìm kiếm đặc biệt, như eBay hoặc các cửa hàng trực tuyến với số lượng sản phẩm khổng lồ, chẳng hạn như Amazon và Wal-Mart.

Trong các trường hợp khác, tốt hơn nên sử dụng tìm kiếm theo khía cạnh. Của anh ấy sự khác biệt chính từ tìm kiếm danh mục là người dùng thu hẹp lựa chọn sản phẩm SAU KHI họ nhận được kết quả cho truy vấn tìm kiếm chứ không phải TRƯỚC.

Sử dụng tìm kiếm theo khía cạnh

Tìm kiếm theo khía cạnh cho phép người dùng thu hẹp kết quả tìm kiếm của họ bằng cách sử dụng các bộ lọc dựa trên thuộc tính của sản phẩm mà người dùng đang xem. Nếu trước đây tìm kiếm theo khía cạnh là một bổ sung thú vị cho một cửa hàng trực tuyến thì giờ đây người dùng đã quen với nó đến mức họ tìm kiếm nó trên trang web và bày tỏ sự không hài lòng nếu nó không có ở đó. Ngày nay, các trang web thương mại điện tử không có tìm kiếm theo khía cạnh là ngoại lệ hơn là quy luật.

Tìm kiếm theo khía cạnh trên trang web của cửa hàng trực tuyến Utkonos: các bộ lọc ở bên trái cho phép bạn thu hẹp kết quả

Tự động hoàn thành trong thanh tìm kiếm

Hỗ trợ tính năng tự động hoàn thành

Tính năng tự động hoàn thành là khi người dùng nhập một từ vào thanh tìm kiếm, anh ta sẽ thấy các truy vấn được đề xuất trong danh sách thả xuống. Nếu một yêu cầu từ danh sách phù hợp với người dùng thì điều này giúp anh ta tiết kiệm thời gian và cũng giúp tránh lỗi chính tả và các lỗi khác.

Tính năng tự động hoàn thành đã có mặt trên hầu hết các trang web mà NNGroup nghiên cứu. Đồng thời, nghiên cứu cho thấy người dùng không thường xuyên chọn các phương án từ danh sách được đề xuất - chỉ trong 23% trường hợp. Thông thường, họ sẽ tiếp tục nhập truy vấn của mình.

Tuy nhiên, tính năng tự động hoàn thành rất hữu ích. Ngay cả khi người dùng không chọn tùy chọn từ danh sách, họ vẫn có thể xem và hiểu những sản phẩm nào có sẵn trên trang web và những gì người mua hàng khác đang tìm kiếm.

Hỗ trợ tự động hoàn thành nâng cao

Tự động hoàn thành các tìm kiếm có chứa sản phẩm, ảnh và nội dung khác được đề xuất ngoài danh sách truy vấn là xu hướng đang trở nên phổ biến trên một số trang web điện tử. Anh ta xuất hiện khoảng năm năm trước, nhưng nhanh chóng biến mất, và bây giờ anh ta đã quay trở lại. hình thức mới, gợi nhớ đến meganu - trường thả xuống với các tùy chọn truy vấn được đề xuất chiếm khá nhiều không gian trên màn hình.

Tìm kiếm với tính năng tự động hoàn thành nâng cao trong cửa hàng trực tuyến Labyrinth

Nghiên cứu của NNGroup đã chỉ ra rằng tính năng này hoạt động tốt nhất trên các trang web có nhiều danh mục sản phẩm hoặc các sản phẩm có hình ảnh rất khác nhau.

Các vấn đề tìm kiếm cơ bản

Các vấn đề chính khiến việc tìm kiếm trên trang web trở nên khó khăn:

  • chức năng tìm kiếm kín đáo: ví dụ: ẩn sau biểu tượng kính lúp nhỏ trên màn hình lớn hoặc trên thực đơn hamburger phiên bản điện thoại trang mạng;
  • chuỗi tìm kiếm không đủ “thông minh”, không thể xử lý lỗi chính tả, lỗi hoặc từ đồng nghĩa cho từ khóa truy vấn;
  • hiển thị kết quả không chuẩn (chuyển đổi giữa các trang, sắp xếp, lọc);
  • bộ lọc được thiết kế kém (thuộc tính không liên quan, chức năng kém, kết quả trống).

Cách USABILITYLAB có thể giúp cải thiện khả năng tìm kiếm trên trang web cửa hàng trực tuyến của bạn

Điều này kết thúc phân tích của chúng tôi về bài viết NNGroup. Chúng tôi hy vọng nó hữu ích cho bạn.

Nếu bạn muốn đánh giá hoặc cải thiện tìm kiếm trên trang web của mình, vui lòng liên hệ với chúng tôi. Chúng tôi sẽ thực hiện nó. Để kiểm tra khả năng sử dụng, chúng tôi sẽ mời các đại diện của bạn khán giả mục tiêu. Họ sẽ làm việc trên trang web của bạn dưới sự giám sát của chuyên gia của chúng tôi. Phòng thí nghiệm của chúng tôi được trang bị gương một chiều nên bạn cũng có thể có mặt trong quá trình thử nghiệm và quan sát mọi việc người trả lời làm. Dựa trên kết quả thử nghiệm, chúng tôi sẽ đưa ra kết luận về mức độ tìm kiếm trên trang web của bạn đáp ứng nhu cầu của người dùng và đưa ra các đề xuất để cải thiện nó mà bạn có thể chuyển cho các nhà phát triển của mình.

Để tìm hiểu thêm về các dịch vụ của chúng tôi, hãy để lại yêu cầu trên trang web của chúng tôi hoặc viết thư cho Dmitry Silaev: