Elastic Search – Fullstack Station https://fullstackstation.com Hướng dẫn lập trình, thiết kế, lập trình web, thiết kế web, lập trình javascript, lập trình fullstack từ cơ bản đến nâng cao Thu, 28 Mar 2019 13:06:08 +0000 vi hourly 1 https://wordpress.org/?v=6.8.3 https://fullstackstation.com/wp-content/uploads/2019/08/favicon.ico Elastic Search – Fullstack Station https://fullstackstation.com 32 32 Cải thiện chức năng tìm kiếm trong WordPress với plugin Relevanssivà Co-Authors Plus https://fullstackstation.com/cai-thien-chuc-nang-tim-kiem-trong-wordpress-voi-plugin-relevanssiva-co-authors-plus/ https://fullstackstation.com/cai-thien-chuc-nang-tim-kiem-trong-wordpress-voi-plugin-relevanssiva-co-authors-plus/#comments Thu, 28 Mar 2019 13:06:06 +0000 http://fullstackstation.com/?p=1525 Chức năng tìm kiếm trong WordPress hoạt động kém hiệu quả, việc sử dụng plugin bên ngoài dường như là điều tất yếu. Bài viết trình bày cách sử dụng plugin Relevanssi và kết hợp với Co-Authors Plus để tìm kiếm nội dung theo tên và thông tin của tác giả một cách hiệu quả. […]

The post Cải thiện chức năng tìm kiếm trong WordPress với plugin Relevanssivà Co-Authors Plus appeared first on Fullstack Station.

]]>
Chức năng tìm kiếm trong WordPress hoạt động kém hiệu quả, việc sử dụng plugin bên ngoài dường như là điều tất yếu. Bài viết trình bày cách sử dụng plugin Relevanssi và kết hợp với Co-Authors Plus để tìm kiếm nội dung theo tên và thông tin của tác giả một cách hiệu quả.

Mặc dù Relevanssi xác nhận có hỗ trợ Co-Authors Plus (https://www.relevanssi.com/knowledge-base/relevanssi-and-co-authors-plus/) nhưng thực tế thì không hoạt động đúng như mong đợi. Mình đã tìm ra cách xử lý và chia sẽ cho ai cần.

Giới thiệu plugin Relevanssi

Có lẽ khi cần đưa ra giải pháp tìm kiếm thường mọi người hay nghĩ đến ElasticSearch, nhưng với nền tảng dựa trên nội dung có tính chất thay đổi linh hoạt cao như WordPress (ví dụ thêm bớt taxonomies chẳng hạn) hoặc số lượng nội dung không quá lớn thì việc dùng ElasticSearch cũng không hẳn mang lại hiệu quả cao. Mặc dù bạn vẫn có thể xài plugin ElasticPress https://wordpress.org/plugins/elasticpress/ để tích hợp ElasticSearch, tuy nhiên những website không đòi hỏi lập trình phức tạp, thì việc dùng ElasticSearch theo mình nhận định là vẫn không cần thiết.

Công cụ tìm kiếm mặc định của WordPress thì càng tệ, khi nó chỉ có thể tìm kiếm trong tiêu đề và phần nội dung của bài viết. Với plugin Relevanssi tích hợp chặt chẽ vào WordPress, cho phép tìm kiếm loại nội dung được chỉ định, các trường nội dung tuỳ chỉnh (custom field), hoặc các taxonomies, ngoài ra còn có nhiều tuỳ chỉnh cấu hình hữu ích khác.

Các tính năng đặc trưng:

  • Chọn loại nội dung muốn tìm kiếm
  • Chọn taxonomies muốn tìm kiếm
  • Có thể tìm kiếm trong phần bình luận, tác giả, shortcode
  • Thiết lập từ đồng nghĩa, stopwords
  • Lưu vết tìm kiếm
  • Có thể tuỳ chỉnh trích đoạn và làm nổi bật nội dung tìm kiếm
  • Có thể dùng toán tử “OR” hay “AND” tuỳ ý, với WordPress thì mặc định là “AND” vì vậy không thể tìm kiếm với từ khoá có trong nội dung và có trong term.
Chọn Taxonomies muốn tìm kiếm

Những yếu điểm của Relevanssi

Mặc dù mình đánh giá khá cao plugin Relevanssi, nhưng vẫn có những hạn chế sau:

  • Chỉ tìm kiếm được nội dung trong bảng posts, và postmeta, ngoài ra sẽ không tìm kiếm được.
  • Không tìm kiếm với các điều kiện phức tạp như tổ hợp toán tử ORAND lồng nhau.
  • Không tìm kiếm trực tiếp dạng live-search được.

Fullstack Station Tips

Các điểm yếu ở trên có thể khắc phục được nếu bạn nắm được linh hồn của plugin này chính ở bảng relevanssi, bạn hoàn toàn có thể bổ sung dữ liệu vào bảng này từ plugin khác và thay thế column `type` với tên dữ liệu của bạn. Đồng thời ở phần query thì cần chỉnh sửa thêm tuỳ theo nhu cầu thay vì sử dụng hàm của plugin thì bạn tự viết hàm query khác, dựa vào column term lấy ra doctype là có thể . Tất nhiên muốn khắc phục được theo kiểu này thì gần như phải đục vào plugin và không khuyến khích vì bạn có thể sẽ mất khả năng cập nhật từ plugin này.

Ngoài ra, mặc định plugin dùng kiểu query “%keyword” và “keyword%” nên có thể không đáp ứng nhu cầu của bạn, thì bạn có thể dùng filter bên dưới. Tất nhiên, với truy vấn “%keyword%” thì tốc độ có chậm đi đôi chút, nhưng vẫn chấp nhận được với bộ dữ liệu khoảng 2000 bài viết và 200k dòng về term được sinh ra.

/**
 * Modify relevannssi's query
 *
 * @param string $query
 * @return string
 */
function skdr_relevanssi_partial_inside_words( $query ) {
	return "(term LIKE '%#term#%')"; 
}
add_filter( 'relevanssi_fuzzy_query', 'skdr_relevanssi_partial_inside_words' );

Giới thiệu plugin Co-Authors Plus

“Đồng tác giả” là 1 chức năng thiếu sót của WordPress trong thực tế, bởi vì 1 bài viết có thể do nhiều người cùng góp sức, Co-Authors Plus ra đời để bù dắp thiếu sót này. Mặc dù số lượng “active installation” chỉ khoảng hơn 30k, nhưng mình nghĩ thực tế các dự án dùng composer để install thì sẽ nhiều hơn nữa.

Plugin này có khả năng thiết kế nội dung đặc tả cho 1 người như: họ tên, nghề nghiệp, giới thiệu, các liên kết mạng xã hội, … Plugin rất hay và được viết tốt, nhiều chức năng và có các hàm api lấy dữ liệu.

Ví dụ dưới đây về cách thêm các trường tuỳ biến:

function skdr_coauthors_guest_author_fields($fields, $groups)
{
    $additionalFields = [

        array(
            'key' => 'real_display_name',
            'label' => __('Display name', 'seikeidenron'),
            'group' => 'name',
            'required' => true,
        ),
        array(
            'key' => 'furigana',
            'label' => __('Furigana', 'seikeidenron'),
            'group' => 'name',
            'required' => true,
        ),
        array(
            'key' => 'company',
            'label' => __('Company', 'seikeidenron'),
            'group' => 'about',
        ),
        array(
            'key' => 'job_title',
            'label' => __('Job title', 'seikeidenron'),
            'group' => 'about',
        ),
        array(
            'key' => 'photo_credit',
            'label' => __('Photo credit', 'seikeidenron'),
            'placeholder' => __('Optional'),
            'group' => 'about',
        ),
    ];
    foreach ($additionalFields as $single_field) {
        if (in_array($single_field['group'], $groups) || 'all' === $groups[0] && 'hidden' !== $single_field['group']) {
            $fields[] = $single_field;
        }
    }
    //overwirte display name
    if (is_array($groups) && $groups[0] == 'name') {
        foreach ($fields as $key => $field) {
            if ($field['key'] == 'display_name') {
                $fields[$key] = [
                    // Name

                    'key' => 'display_name',
                    'label' => __('Username (Romaji only)', 'seikeidenron'),
                    'group' => 'name',
                    'required' => true,
                ];
            }
        }
    }
    return $fields;
}
add_filter('coauthors_guest_author_fields', 'skdr_coauthors_guest_author_fields', 10, 2);

Khi mình sử dụng plugin này với Relevanssi giới thiệu ở trên thì có vấn đề này sinh là Relevanssi không index được nội dung của plugin Co-Author Plus với các trường tuỳ biến tạo thêm. Vì vậy nếu bạn có sử dụng chung plugin này hoặc như các plugin khác mà bị vấn đề không index được thì làm theo cách bên dưới.


/**
 * Add additional data 
 *
 * @param array $insert_data
 * @param WP_Post $post
 * @return array
 */
function skdr_relevanssi_indexing_data($insert_data, $post){
	global $coauthors_plus;
	$authors = get_coauthors($post->ID);

	$authorIds = [];
	foreach ((array)$authors as $author){
		if (in_array($author->ID, $authorIds)) {
			continue;
		}
		$authorIds[] = $author->ID;
                //Fullstackstation.com 
                // Giả sử chúng ta có 2 thuộc tính là real_display_name và furigana được khai báo trong Co-Authors Plus
		$author_name = $author->real_display_name?$author->real_display_name:$author->display_name; 
		if(!empty($author_name) && !isset($insert_data[$author_name])){
			$insert_data[$author_name] = array("author" => 1);
		}	
		$author_furigana = $author->furigana;
		if(!empty($author_furigana) && !isset($insert_data[$author_furigana]) ){
			$insert_data[$author_furigana] = array("author" => 1);
		}
	}
	// find author data
	return $insert_data;
}
add_filter('relevanssi_indexing_data', 'skdr_relevanssi_indexing_data', 10, 2);

Ngoài ra, bạn có thể thay đổi dữ liệu với các cột bên dưới, các cột này dùng để tính điểm khi hiển thị kết quả tìm kiếm. Kết hợp với tỉ lệ/trọng số điểm được thiết lập thông số trong màn hình quản lý của plugin sẽ tạo ra điểm số tương ứng.

$fields = array( 'content', 'title', 'comment', 'tag', 'link', 'author', 'category', 'excerpt', 'taxonomy', 'customfield', 'mysqlcolumn' );

Fullstack Station Tips

Chức năng tìm kiếm là chức năng rất quan trọng, mặc dù hiện nay đa phần chúng ta thường dựa vào Google Search, nhưng việc có bộ tìm kiếm nội bộ là rất quan trọng để lọc dữ liệu tìm kiếm theo chủ ý của chúng ta. Mình đã tìm một số plugin về chức năng tìm kiếm nhưng không có cái nào làm mình hài lòng như Relevanssi, mặc dù plugin có bản trả phí hơn 100$ mỗi năm, nhưng với bản miễn phí mình nghĩ là dùng đủ. Nếu có nhu cầu về index văn bản, mình nghĩ bạn nên cân nhắc sử dụng ElasticPress với ElasticSearch.

The post Cải thiện chức năng tìm kiếm trong WordPress với plugin Relevanssivà Co-Authors Plus appeared first on Fullstack Station.

]]>
https://fullstackstation.com/cai-thien-chuc-nang-tim-kiem-trong-wordpress-voi-plugin-relevanssiva-co-authors-plus/feed/ 1
Vũ khí bí mật dành cho khởi nghiệp https://fullstackstation.com/vu-khi-bi-mat-danh-cho-khoi-nghiep/ https://fullstackstation.com/vu-khi-bi-mat-danh-cho-khoi-nghiep/#comments Tue, 05 Jan 2016 16:44:18 +0000 https://www.businesscard.vn/blog/?p=158 Khởi nghiệp Có vũ khí bí mật chưa chắc dẫn bạn đến việc khởi nghiệp thành công, nhưng ít nhất nó cũng gợi mở cho bạn những hướng đi, những đường tắt để đến thành công. Hôm nay mình sẽ bật mí đến các bạn một số vũ khí công nghệ mà mình thấy rất lợi […]

The post Vũ khí bí mật dành cho khởi nghiệp appeared first on Fullstack Station.

]]>
Khởi nghiệp

vũ khí bí mật chưa chắc dẫn bạn đến việc khởi nghiệp thành công, nhưng ít nhất nó cũng gợi mở cho bạn những hướng đi, những đường tắt để đến thành công. Hôm nay mình sẽ bật mí đến các bạn một số vũ khí công nghệ mà mình thấy rất lợi hại cho việc khởi nghiệp, nhất là ở lĩnh vực web và mobile. Ý tưởng giống nhau nhưng được thực hiện bởi những người khác nhau sẽ có cách làm khác nhau và sẽ có những thành công lớn nhỏ khác nhau.

Các vũ khí này, bạn không cần phải học quá nhiều, mà chỉ cần nhấc lên mà dùng thôi!

1. Prediction IO: hệ thống máy học

Website: Prediction.io

Có lẽ nếu bạn tìm những cụm từ như “Machine learning open source” thì Prediction.io luôn nằm top đầu. Vậy nhưng kết quả có thứ hạng tương đương “11 open source tools machine learning” thì lại không có Prediction.io trong này. Vậy là sao nhỉ?

Theo mình thì bài viết đó có thiếu sót rất lớn khi bỏ qua Prediction.io! Bài viết đó có cách đây 1 năm nhưng Prediction.io đã có cách đây 3 năm và đã có những tính năng rất hay từ trước. Hiện nay công nghệ của Prediction.io cũng đã đạt 8000 stars trên Github rồi, số lượng cài đặt không được tính.

Với những sản phẩm “khởi nghiệp“, điều tạo ra sự khác biệt đó là tính “thông minh” của sản phẩm. Bằng cách này hay cách khác, nhưng với Prediction.io thì đó là 1 cách đơn giản và hiệu quả! Bạn có thể tạo ra các sản phẩm có các tính năng như:

  • Khuyến nghị sản phẩm (món hàng, bài viết, …) cùng loại, sản phẩm mà hệ thống “nghĩ” người dùng sẽ thích: được dùng như AppStore hay PlayStore, hoặc các trang thương mại điện tử Amazon, eBay…
  • Gây quỹ cộng đồng (Crowdfunding): bản chất hình thức thì giống trường hợp trên. Dùng để kết hợp giữa Dự án và người đầu tư một cách có hiệu quả và chính xác nhất.

2. Hệ thống tìm kiếm: Apache Lucence Solr hoặc ElasticSearch

Website: Apache Lucense Solr hoặc Elastic Search

Mình không đi sâu vào việc so sánh của 2 công cụ ở bài này, vì đã có ở đây so sánh rất trực quan rồi. Điều mình muốn nói là các sản phẩm khởi nghiệp, muốn thành công đều nên áp dụng 1 trong 2 sản phẩm này, hoặc 1 sản phẩm nào khác là một hệ thống tìm kiếm nội bộ. Tất nhiên là không vơ đũa cả nắm khi nói tất cả dự án đều sử dụng hệ thống tìm kiếm, nhưng nếu là dự án có cơ sở dữ liệu mà không có hệ thống tìm kiếm cho mục đích phục vụ người dùng hay phục vụ quản trị thì cũng hơi thiếu thiếu!

Hai hệ thống này không dừng lại ở việc tìm kiếm trong cơ sở dữ liệu của bạn mà còn sử dụng để tìm kiếm theo luồng dữ liệu từ hệ thống khác.

Với nhu cầu realtime thì bạn nên cân nhắc dùng Elastic Search, ví dụ:

  • Dùng API của Twitter tìm các tweet trong thành phố Hà Nội theo từ khóa XYZ nào đó, kết hợp các luồng này lại và tìm kiếm lọc nội dung thêm lần mới đưa vào database. Việc tìm kiếm số lượng lớn từ khóa dẫn đến sự phân tích, thống kê trực tuyến dữ liệu này giúp cho bạn có cơ hội nắm bắt xu hướng rất thời sự.
  • Dùng để quản lý log: việc hệ thống website lớn với dữ liệu log liên tục, việc phát hiện các vấn đề sớm hết sức quan trọng như lỗi website hay bị tấn công DDOS. Vì log được ghi theo stream, nên việc tìm kiếm realtime là điều tất yếu.
  • Hệ thống bảng giá chứng khoán: với dữ liệu giá liên tục, việc phát hiện nhanh chóng dấu hiệu “làm giá” dành cho việc quản lý, hay phát hiện xu hướng giá dành cho nhà đầu tư giá có giá trị cực kỳ quan trọng. Rất tiếc là mình không còn làm trong ngành này khi biết đến Elastic Search.

Với Lucence Solr thì có lẽ hơi yếu thế hơn 1 chút ở mảng realtime khi nhìn vào các ví dụ trên, nhưng đó chỉ là sự giới hạn của cá nhân mình. Còn bạn có thể tận dụng sức mạnh của các hệ thống này kết hợp với ý tưởng của riêng mình để làm ra sản phẩm tốt nhé.

3. Glide: hệ thống xử lý ảnh trên mây

Website: Glide

Những bạn đã dùng PHP chắc đã từng sử dụng thư viện Timthumb, không quá mạnh mẽ nhưng cũng đủ xài cho Resize, Crop, Filter. Tuy nhiên, Timthumb đã ngừng phát triển từ lâu và việc so sánh Timbthumb và Glide mặc dù là giống về mục đích nhưng khá khập khiễng. Glide được so sánh với Cloudinary hay Imgix, những hệ thống quản lý hình ảnh trên mây.

Với Glide, bạn hoàn toàn có thể sử dụng như một thư viện tích hợp trong dự án, hoặc dùng nó như một server riêng phục vụ hình ảnh thông qua HTTP. Do Glide dùng thư viện GD hoặc ImageMagick nên bạn không cần phải sử dụng thư viện để xử lý hình ảnh nữa.

Ví dụ, xem hình sau:

https://glide.herokuapp.com/1.0/kayaks.jpg?w=600&gam=.9&sharp=8

Thêm tí blur:

https://glide.herokuapp.com/1.0/kayaks.jpg?w=600&gam=.9&sharp=8&blur=20

Hay là filter trắng đen:

https://glide.herokuapp.com/1.0/kayaks.jpg?w=600&gam=.9&sharp=8&filt=sepia

Hoặc đóng dấu bản quyền:

https://glide.herokuapp.com/1.0/kayaks.jpg?w=500&mark=billabong.png&markw=30w&markpad=3w&markpos=top-right

Đánh giá: Glide phù hợp cho bất cứ dự án nào có sử dụng hình ảnh. Có rất nhiều website không quan tâm đến việc hình ảnh, nên hình ảnh trên website méo mó, hoặc ảnh bị cắt đầu, không đúng trọng tâm dẫn đến việc ảnh hưởng nghiêm trọng đến giao diện website. Cho dù website đầu tư vào design nhiều như thế nào đi nữa nhưng hình ảnh trên website không đẹp thì cũng giảm sức hút khá nhiều. Bạn có thể kết hợp thêm với SmartCrop (Github ~8000 stars) để có ảnh crop thông minh  nên rất đẹp!

4. Nhận dạng khuôn mặt

Có lẽ công nghệ nhận dạng khuôn mặt đã trở nên phổ biến trên nhiều sản phẩm, hoặc cũng đã có nhiều thư viện hỗ trợ. Nhưng với ứng dụng “Đoán tuổi của Microsoft” nổi lên như cồn trong năm 2015 thì rõ ràng độ nóng của tính năng nhận dạng khuôn mặt vẫn rất cao.

Nếu bạn khởi nghiệp trong lĩnh vực liên quan đến hình ảnh, sẽ rất cần sử dụng những tính năng này. Tuy có nhiều thư viện, nhưng đa phần đều có giới hạn vì chỉ nhận dạng được khuôn mặt :(. Mình giới thiệu dịch vụ Face++, được cấp phép sử dụng miễn phí qua API, có những tính năng hay như: xác định nam, nữ, độ tuổi, màu da, thuộc gốc châu lục nào, có mang kính hay không, độ nghiêng của khuôn mặt, có cười hay không…Rất tuyệt phải không nào? Hơn nữa, do việc dùng REST API, nên việc cài đặt sử dụng cho sản phẩm của bạn rất dễ dàng!

Ngoài ra, bạn có thể tìm hiểu thêm tại Facedetect/Software. Với mình thì mình sẽ dùng Face++: nhiều tính năng, miễn phí, sẽ sử dụng, vậy là quá đủ.

5. Tự động hóa ở browser

Tự động hóa ở browser là 1 cách để bạn crawl dữ liệu được lấy bằng 1 loạt các bước phức tạp. Thông thường, sẽ khá là dễ dàng khi lấy dữ liệu của những trang công khai, hoặc có sẵn API. Tuy nhiên nếu bạn đụng phải những trang web có cách lấy nội dung phức tạp, hãy sử dụng Nightmare (6000 stars trên Github).

NightmareJs là một thư viện tự động hóa ở tầng Browser, có nghĩa là thao tác như 1 người bình thường sử dụng trình duyệt web. NightmareJs sử dụng Electron để thực hiện các thao tác ở browser, nó không quá khác so với việc sử dụng PhantomJs hoặc dùng Selenium (là hệ thống test tự động) nhưng đơn giản hơn rất nhiều, đặc biệt là khi sử dụng Daydream, sẽ khi lại thao tác của bạn từ trình duyệt và xuất ra thành code javascript để dùng cho NightmareJs. Usecase cho tự động hóa thì chắc cũng nhiều, cứ cái gì bạn nghĩ đến mà nó bao gồm nhiều thao tác, phải làm đi làm lại, thì khi đó cần đến thôi.

6. Các tài nguyên khác selfhosted

Có nhiều dịch vụ phục vụ cho khởi nghiệp mà bạn có thể cài đặt và điều chỉnh theo nhu cầu sử dụng của mình:

Github: Awesome SelfHosted

Các dịch vụ, công nghệ được liệt kê trong danh sách trên được sử dụng cho mục đích hỗ trợ (Mail, IRC, Analytics…) hoặc nền tảng để tạo sản phẩm (Blogging Platform, Social Network & Forums Platform, CMS, Ecommerce…).

Kết:

Như đã nói ở đầu bài, việc có ý tưởng và bắt tay xây dựng ý tưởng đều phụ thuộc cách bạn làm như thế nào. Mình đã giới thiệu một vài vũ khí mà theo mình là cần có trong các sản phẩm thời nay, việc kết hợp như thế nào đó là một sự tinh túy của riêng bạn.

Hi vọng qua bài viết này sẽ giúp cho bạn tìm ra một vài ý tưởng mới, và hãy bắt tay vào làm việc ngay cho dự án khởi nghiệp thôi. Nếu bạn có công cụ nào hay, mình cũng rất muốn biết để mở rộng kiến thức, hãy chia sẽ cùng mình và mọi người nhé.

Đón đọc các bài viết sắp tới tại Lịch xuất bản.

The post Vũ khí bí mật dành cho khởi nghiệp appeared first on Fullstack Station.

]]>
https://fullstackstation.com/vu-khi-bi-mat-danh-cho-khoi-nghiep/feed/ 1