<commit_before>---
title: 简单拼音搜索引擎
date: 2017-09-19 15:44:24
tags:
  - Search Engine
  - Javascript
---

本文主要是通过分析[pinyin-engine](https://github.com/aui/pinyin-engine)源码，一步步基于Javascript实现一个拼音搜索引擎，全部源码（包括注释）都发布在Github上：[SearchEngine](https://github.com/yugasun/SearchEngine)

本文主要分为两部分：

1. 实现简单的搜索文字匹配
2. 结合汉字拼音字典实现拼音搜索引擎

PS: 本文均基于ES6语法实现，考虑到兼容性，通过 [webpack](https://webpack.js.org/)工具 来进行编译输出ES5语法。

<!--more-->

## 实现简单的搜索文字匹配

### 创建搜索引擎类

一个基本的搜索类，必然包含所要搜索的数据集和需要搜索的属性集合，而且必须实现一个搜索方法，代码如下：

```js
class PinyinEngine {
  /**
   * 构造函数
   *
   * @param {Object} data 用户提供的需要搜索的数据集
   * @param {Array} indexs  用户提供查询的属性数组 - 对象键值
   * @memberof PinyinEngine
   */
  constructor (data, indexs) {
    this.data = data<commit_msg>Add demo url for post: simple search engine<commit_after>---
title: 简单拼音搜索引擎
date: 2017-09-19 15:44:24
tags:
  - Search Engine
  - Javascript
---

本文主要是通过分析[pinyin-engine](https://github.com/aui/pinyin-engine)源码，一步步基于Javascript实现一个拼音搜索引擎，全部源码（包括注释）都发布在Github上：[SearchEngine](https://github.com/yugasun/SearchEngine)

[在线Demo](https://demo.yugasun.com/SearchEngine/example)

本文主要分为两部分：

1. 实现简单的搜索文字匹配
2. 结合汉字拼音字典实现拼音搜索引擎

PS: 本文均基于ES6语法实现，考虑到兼容性，通过 [webpack](https://webpack.js.org/)工具 来进行编译输出ES5语法。

<!--more-->

## 实现简单的搜索文字匹配

### 创建搜索引擎类

一个基本的搜索类，必然包含所要搜索的数据集和需要搜索的属性集合，而且必须实现一个搜索方法，代码如下：

```js
class PinyinEngine {
  /**
   * 构造函数
   *
   * @param {Object} data 用户提供的需要搜索的数据集
   * @param {Array} indexs  用户提供查询的属性数组 - 对象键值
   * @memberof PinyinEngine
   */
  constructor (data, indexs) {
    this.data = data
{'fraction_non_alphanumeric': 0.14517174335709657, 'fraction_numerical': 0.023331173039533377, 'mean_word_length': 4.361111111111111, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 5, 'https://': 7, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '2133079', 'n_tokens_mistral': 921, 'n_tokens_neox': 1036, 'n_words': 95}