最近、同社のプロジェクトのための統合されたフルテキスト検索エンジンで数日間過ごし、プロジェクトの当初の目的は、検索ボックスのための即時のプロンプトです。データは小さくないので、同期の後、最初の継続的な増分同期を考慮する必要がある、は、MySQLからのデータを同期する必要があります。ここで使用されるオープンソースサービスがElasticSearchです。
同僚は私が前に理解していなかったが、サービスを提供するには、以前のRedisについての詳細を知っていると、製品の評判と同じ推定されるべきではないと思います専門にアマゾンの例を参照することをお勧めする前にElasticSearchは、オープンソースの全文検索エンジンサービスを使用することは非常に簡単ですだけでなく、テストは、本番環境で使用することができます立っています。何かを理解するためにインターネットを発見した後、実際にそうです:
フルテキスト検索は、最も一般的なニーズの中で、オープンソースElasticsearchは今の好適フルテキスト検索エンジンです。それはすぐに、保管、検索、および大量のデータを分析することができます。ウィキペディアは、スタックオーバーフロー、Githubには、それを採用しています。
騒ぎ、私のビルドプロセスの通常の記録として。
インストールElasticSearch
CentOSのソースからインストールし、私は個人的にはまだyumを好むインストールする方法はいくつかあります。
ヤムは、CentOSのインストール
入力するには、まず/etc/yum.repos.d
、ディレクトリをという名前のファイルを作成しelasticsearch.repo
たソースを、以下の内容を記入:
[elasticsearch-6.x]
name=Elasticsearch repository for 6.x packages
baseurl=https://artifacts.elastic.co/packages/6.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
ここでは弾性最新バージョンは6.2ですが、対応するElasticsearch-PHPはPHPのバージョン7.0以降が必要です。同社のPHPバージョン5.xとして、これだけセカンドベスト、古いバージョン5.6.9の少し、インストール5.xのバージョンを選択し、このステップは、ソースファイルの内容の上のすべての6が必要になります。 X 5.xのは、交換することができます。
次回の実行
yum install elasticsearch
他のサーバからネットワークにアクセスする必要性が、また、リスニング範囲を開く必要がある場合は、インストール後は、デフォルトでは、唯一のローカルサービスにアクセスすることが可能です。インストールディレクトリを入力し/usr/share/elasticsearch
、編集しelasticsearch.yml
たファイルを、次のセクションを変更します。
network.host: 0.0.0.0
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
http.host: 0.0.0.0
transport.host: 127.0.0.1
これはnetwork.host
一方で、外部ネットワークへのアクセスにあるpath.data
とpath.logs
、デフォルトのパスが正しく設定されていないため、手動で設定する必要がありますが。セットアップが完全なパスされた後、以前のインストールディレクトリ内の残留量、空バックアップする必要がある場合に、それ以外の場合は問題が発生します、これら2つのディレクトリが存在するか確認する必要があります。
その後、サービスを再起動します。
service elasticsearch restart
インストールのテスト
再起動が完了したら、ブラウザに入力してください
http://127.0.0.1:9200/?pretty
あなたはインストールが成功したことを示す対応情報を見ることができる場合
インストールLogStash
そして、統一地方行政にログログ情報のすべてのタイプを要約するために使用されLogStashサービスをインストールし、ここでは弾性にMySQLからのデータを同期するためにそれを使用するために必要で、このサービスを使用します。
YUMはLogStashをインストール
これはまた、弾性製品の本拠地であるため、それ以前の設定ソースに含まれており、今のみのインストールを実行する必要があります。
yum install logstash
これは、インストールを完了します。そして、あなたはまた、プラグインをインストールする必要があり、心配しないでください。
インストールlogstash入力-JDBCプラグ
入力する最初の/usr/share/logstash/bin
ディレクトリを、実行します。
./logstash-plugin install logstash-input-jdbc
プラグインがインストールされた後、logstashインストールは現在、完全とみなされます。そこに多くのプラグインは、機能豊富なさまざまなを達成することができませんが、ここではこれ以上言います。
弾性の同期を設定するには、MySQLのデータ
次いで、フォーカスがどこ弾性にMySQLデータベースの同期からの構成データの比較。まず、任意のディレクトリ同期プロファイルに設立され、同期スクリプトは、私がここにあるあまりないので、直接ディレクトリlogstashのを行い置きます:
cd /usr/share/logstash/bin
mkdir ktsee
cd ktsee
次に、2つのファイルを作成jdbc.conf
し、設定ファイル、同期されているMySQLのスクリプトの同期を。まず、編集、コンテンツを記入:jdbc.sql
jdbc.conf
jdbc.sql
jdbc.conf
input {
stdin {
}
jdbc {
# mysql jdbc connection string to our backup databse 后面的ktsee对应mysql中的test数据库
jdbc_connection_string => "jdbc:mysql://192.168.1.1:3306/ktsee"
# the user we wish to excute our statement as
jdbc_user => "root"
jdbc_password => "password"
# the path to our downloaded jdbc driver 这里需要设置正确的mysql-connector-java-5.1.38.jar路径,找不到可以从网上下载后放在配置路径中
jdbc_driver_library => "/elasticsearch-jdbc-2.3.2.0/lib/mysql-connector-java-5.1.38.jar"
# the name of the driver class for mysql
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
# 以下对应着要执行的sql的绝对路径
statement_filepath => "/usr/local/logstash/bin/logstash_jdbc_test/jdbc.sql"
# 定时字段 各字段含义(由左至右)分、时、天、月、年,全部为*默认含义为每分钟都更新
schedule => "* * * * *"
# 设定ES索引类型
type => "ktsee_type"
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
}
output {
elasticsearch {
#ESIP地址与端口
hosts => "192.168.1.1:9200"
#ES索引名称(自己定义的)
index => "ktsee_index"
#自增ID编号
document_id => "%{id}"
}
stdout {
#以JSON格式输出
codec => json_lines
}
}
これは、上記の構成ファイル内の対応する音符があることに留意すべきです。
プロジェクトに統合さElasticsearch-PHPライブラリを使用します
ここでは、自動的に他の依存ライブラリをダウンロードし、作曲、対応するバージョンに取り付け、直接、パケット管理のための作曲を使用してプロジェクトが、それはシンプルであれば、Elasticsearch公式PHPライブラリElasticsearch-PHPを使用することを選択しました。プロジェクトにコードを追加します。
$client = \Elasticsearch\ClientBuilder::create()
->setHosts(['192.168.1.1:9200'])
->allowBadJSONSerialization()
->build();
$params = [
'index' => 'ktsee_index',
'_source' => [
"id",
"product_name",
"product_type"
],
'body' => [
'query' => [
'match_phrase_prefix' => [
'product_name' => [
"query" => $post['keyword'],
"slop" => 10
]
],
]
]
];
$response = $client->search($params);
このように、検索キーワードに応じElasticSearchするための簡単な通話を実現します。
検索インスタントプロンプトのコードを達成します
HTML部分:
<form method="get" action="/search" id="header_search">
<input type="text" id="keyword" name="keyword" value="" autocomplete="off" />
<input type="submit" value="" />
</form>
<ul id="header_search_suggest"></ul>
これは、と相まって、検索ボックス入力コントロールことは注目に値するautocomplete="off"
近いネイティブのヒントドロップボックスは、回避し、我々はスマートプロンプト紛争をやろうとしています。
CSSの一部:
#header_search_suggest{
position: absolute;
width: calc(100% - 10px);
left: 4px;
border: solid 1px #ccc;
background-color: white;
text-align: left;
z-index: 101;
display: none;
}
#header_search_suggest li{
font-size: 14px;
border-bottom: 1px solid #eeeeee;
}
#header_search_suggest li a{
padding:0.5em 1em;
color:#333333;
display: block;
text-decoration: none;
}
#header_search_suggest li a:hover{
background-color: #EDF0F2;
color:#2F7EC4;
}
#header_search_suggest li a em{
font-style: italic;
color:#999;
font-size:0.8em;
}
JSの一部:
var xhr = null;
$('#keyword').bind('input propertychange', function () {
if (xhr) {
xhr.abort();//如果存在ajax的请求,就放弃请求
}
var inputText = $.trim(this.value);
if (inputText != "") { //检测键盘输入的内容是否为空,为空就不发出请求
xhr = $.ajax({
type: 'POST',
url: '/search/suggest',
cache: false,//不从浏览器缓存中加载请求信息
// data: "keyword=" + inputText,
data: {keyword: inputText},
dataType: 'json',
success: function (json) {
//console.log(json);
if (json.count != 0) {
//检测返回的结果是否为空
var lists = "";
$.each(json.data, function (index, obj) {
//处理高亮关键词
var searchContent = obj.product_name;
var suggestItem = '';
if (searchContent.toLowerCase().indexOf(inputText.toLowerCase()) > -1) {
var searchRegExp = new RegExp('(' + inputText + ')', "gi");
suggestItem = searchContent.replace(searchRegExp, ("<strong>$1</strong>"));
}
suggestItem = suggestItem + "<em> - " + obj.product_type + "</em>";
//遍历出每一条返回的数据
lists += "<li class='listName' ><a href='/search/suggest?id=" + obj.id + "&key=" + encodeURI(searchContent + ' - ' + obj.product_type) + "'>" + suggestItem + "</a></li>";
});
$("#header_search_suggest").html(lists).show();//将搜索到的结果展示出来
} else {
$("#header_search_suggest").hide();
}
//记录搜索历史记录
$.post('/search/savesearchlog',{keyword: inputText,count: json.count});
}
});
} else {
$("#header_search_suggest").hide();//没有查询结果就隐藏搜索框
}
}).blur(function () {
setTimeout('$("#header_search_suggest").hide()',500);//输入框失去焦点的时候就隐藏搜索框,为了防止隐藏过快无法点击,设置延迟0.5秒隐藏
});
デモンストレーション効果
図: