まずCloud Searchサービスを有効化します。
NHN Cloud Consoleでサービス選択をクリックします。
Cloud Searchをクリックします。
サービスが有効化されているかを確認する方法は次のとおりです。
NHN Cloud Console左側メニューでSearchをクリックします。
Cloud Searchが表示されたらサービスが有効になっているということです。
サービスを作成する方法は次のとおりです。
サービス作成ボタンをクリックします。
サービス作成ウィンドウでサービスIDを入力します。
保存ボタンをクリックします。
作成されたサービス結果を確認します。
フィールドを追加する方法は次のとおりです。
フィールド設定タブをクリックします。
フィールド追加ボタンをクリックします。
フィールド名を入力します。
複数の値を使用するかどうかをチェックします。
インデックスを使用するかどうかをチェックします。
フィルタを使用するかどうかをチェックします。
ソートを使用するかどうかをチェックします。
要約を使用するかどうかをチェックします。
保存ボタンをクリックします。
インデックスするファイルを作成してインデックスする方法は次のとおりです。
インデックスファイルの作成
[
{
"action": "add",
"id": "id-1",
"fields": {
"title": "[送料無料]ナイキのシューズ195種!",
"body": "ナイキの人気シューズには売れているワケがあります!ナイキの人気シューズ195種★一足は必要じゃないですか?"
}
},
{
"action": "add",
"id": "id-2",
"fields": {
"title": "[超特価]ナイキの運動靴109種",
"body": "7日間だけの限定価格!超特価]アディダスシューズ109種!迷っていたら売り切れ必至"
}
},
{
"action": "add",
"id": "id-3",
"fields": {
"title": "[アディダス]メンズ運動靴/スリッパ114種",
"body": "[アディダスのシューズ♥]送/料/無/料[アディダス]メンズスリッパ /スーパースター、スタンスミス /チューブラー他114種が手に入るチャンス!"
}
}
]
インデックス方法
インデックスタブをクリックします。
ファイル選択ボタンをクリックします。
インデックスするファイルを選択します。
開くボタンをクリックします。
インデックスコマンドがREST APIで出力されます。
インデックスボタンをクリックします。
インデックス結果を確認します。
REST API
下記のようにREST APIを使用可能です。
curl -XPOST 'https://kr1-search.api.nhncloudservice.com/indexing/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/indexing' -H 'Accept-Language:ja' -H 'Content-Type:multipart/form-data; charset=UTF-8' -F 'file=@documents.json'
curl -XPOST 'https://kr1-search.api.nhncloudservice.com/indexing/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/indexing' -H 'Accept-Language:ja' -H 'Content-Type:application/json; charset=UTF-8' -d '
[
{
"action": "add",
"id": "id-1",
"fields": {
"title": "[送料無料]ナイキシューズ195種!",
"body": "ナイキの人気シューズには売れているワケがあります!ナイキの人気シューズ195種★一足は必要じゃないですか?"
}
},
{
"action": "add",
"id": "id-2",
"fields": {
"title": "[超特価]ナイキの運動靴109種",
"body": "7日間だけの限定価格!超特価]アディダスシューズ109種!迷っていたら売り切れ必至"
}
}
]'
{
"id" : 1
}
curl -i -XGET 'https://kr1-search.api.nhncloudservice.com/indexing/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/indexing_log?id=1' -H 'Accept-Language:ja'
{
"request_time" : "2017-10-23T12:36:43",
"file_name" : "documents.json",
"file_size" : 1185,
"status" : 4
}
検索方法は次のとおりです。
検索タブをクリックします。
検索するフィールド名をチェックします。
検索するフィールドごとに重みを設定します。
ソートするフィールドを選択します。
検索結果に出力するフィールドをチェックします。
検索結果の長さを設定します。
強調(highlight) preタグを設定します。
強調(highlight) postタグを設定します。
検索結果で出力する開始順位を指定します。
検索結果の数を指定します。
検索演算子を選択します。
検索する単語を入力します。
検索アイコンをクリックします。
2~11番まで設定した内容がREST APIで出力されます。
検索結果が出力されます。
REST API
下記のようにREST APIを使用できます。
curl -G -XGET 'https://kr1-search.api.nhncloudservice.com/search/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/search?start=1&size=10&q_option=and,body*1.0,title*1.0&return=&passage.body=180&passage.title=180' -H 'Accept-Language:ja' --data-urlencode q='ナイキ 運動靴' --data-urlencode highlight='<b>,</b>' -H 'Accept-Language:ja'
{
"message" : {
"meta" : {
"timezone" : "+09:00"
},
"result" : {
"status" : {
"code" : 200,
"message" : "OK"
},
"query" : "ナイキ 運動靴",
"start" : 1,
"itemCount" : 1,
"total" : 1,
"itemList" : {
"item" : [
{
"_RELEVANCE" : 100,
"_RANK" : 1,
"_ID" : "id-2",
"body" : "7日間だけの限定価格!超特価]アディダスシューズ109種!迷っていたら売り切れ必至",
"title" : "[超特価]<b>ナイキ</b> <b>運動靴</b> 109種"
}
]
}
}
}
統計を確認する方法は次のとおりです。
統計タブをクリックします。
全体クエリー数または結果がないクエリー数を選択します。
開始日を入力します。
終了日を入力します。
照会ボタンをクリックすると、統計グラフが出力されます。
データダウンロードをクリックすると、クエリーごとに統計データがダウンロードされます。
全体文書数または全体インデックスサイズを選択します。
開始日を入力します。
終了日を入力します。
照会ボタンをクリックすると、統計グラフが出力されます。
REST API
curl -i -XGET 'https://kr1-search.api.nhncloudservice.com/stats/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/stats?kind=total_query_count&date=2020-03-09' -H 'Accept-Language:ja'
[ [ "ナイキ", 8 ], [ "アディダス", 4 ] ]
インデックスおよび検索REST APIを呼び出すことができる端末のIPを制限できます。
ACLの設定方法
下記は、IPアドレスが202.179.177.21の場合にのみインデックスが可能で、検索リクエストはすべてのIPからできるように設定した例です。クエリー統計データダウンロードリクエストは、すべてのIPからできるように設定した例です。
ACLタブをクリックします。
インデックス下の許可にIPアドレスを入力します。
統計 許可に「all」を入力します。
検索 許可に「all」を入力します。
保存ボタンをクリックします。
フィールドを削除する方法は次のとおりです。
削除するフィールドの削除ボタンをクリックします。
保存ボタンをクリックします。
今再インデックスボタンをクリックします。
フィールド設定
インデックス
テストを行うために、下記のデータをインデックスします。
[
{
"action": "add",
"id": "id-1",
"fields": {
"name" : "ナイキエアマックス",
"category" : 1
}
},
{
"action": "add",
"id": "id-2",
"fields": {
"name" : "ナイキシャイアンソリッド",
"category" : 2
}
}
]
検索
フィルタリング値の入力方法です。
filter_or :フィルタフィールド間or演算が必要な場合、v2使用します。
単一の値のフィルタリング
フィールド設定
インデックス
テストを行うために下記のデータをインデックスします。
[
{
"action": "add",
"id": "id-1",
"fields": {
"name" : "FX数学塾",
"location" : [10.1, 10.1]
}
},
{
"action": "add",
"id": "id-2",
"fields": {
"name" : "良木思考力数学塾",
"location" : [10.3, 10.4]
}
},
{
"action": "add",
"id": "id-3",
"fields": {
"name" : "数学の朝塾",
"location" : [10.4, 10.3]
}
}
]
検索
フィールド設定
多重ソート設定
インデックス
テストを行うために下記のデータをインデックスします。
[
{
"action": "add",
"id": "id-1",
"fields": {
"name" : "ナイキエアマックス",
"popular" : 10,
"price" : 84180
}
},
{
"action": "add",
"id": "id-2",
"fields": {
"name" : "ナイキエアズーム",
"popular" : 5,
"price" : 97200
}
},
{
"action": "add",
"id": "id-3",
"fields": {
"name" : "ナイキエアフォース",
"popular" : 5,
"price" : 74680
}
}
]
検索
ソートフィールドを選択し、方式を指定します。
多重ソートフィールドを選択し、方式を指定します。
フィールド設定
インデックス
テストを行うために下記のデータをインデックスします。
[
{
"action": "add",
"id": "id-1",
"fields": {
"name" : "ナイキエアマックス",
"category" : "靴"
}
},
{
"action": "add",
"id": "id-2",
"fields": {
"name" : "ナイキエアズーム",
"category" : "靴"
}
},
{
"action": "add",
"id": "id-3",
"fields": {
"name" : "ナイキスウォッシュ半袖シャツ",
"category" : "衣類"
}
}
]
検索
要約結果
"summary": {
"category": {
"靴": 2,
"衣類": 1
}
}
フィールド設定
インデックス
テストを行うために下記のデータをインデックスします。
[
{
"action": "add",
"id": "id-1",
"fields": {
"title" : "ナイキ靴"
}
},
{
"action": "add",
"id": "id-2",
"fields": {
"title" : "ナイキシューズ"
}
},
{
"action": "add",
"id": "id-3",
"fields": {
"title" : "ナイキバッグ"
}
}
]
検索
「boolean」を選択します。
&, |, (, ), ! を利用したブーリアンクエリーを入力します。
検索
検索結果
"itemList": {
"item": [
{
"_RELEVANCE": 200,
"_RANK": 1,
"_ID": "id-2",
"title": "<b>ナイキ</b>"
"body": "<b>ナイキ</b>"
},
{
"_RELEVANCE": 200,
"_RANK": 2,
"_ID": "id-1",
"title": "<b>ナイキ</b>"
"body": "<b>ナイキ</b>"
}
]
}
重み反映比率を調整
curl -G -XGET 'https://kr1-search.api.nhncloudservice.com/search/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/search?start=1&size=10&q_option=and,title*1.0&return=&passage.title=180&doc_weight_ratio=0.1' --data-urlencode q='ナイキ' --data-urlencode highlight='<b>,</b>' -H 'Accept-Language:ja'
Tip
フィールド設定
インデックス
テストを行うために下記のデータをインデックスします。
[
{
"action": "add",
"id": "id-1",
"ranking": 2,
"fields": {
"title" : "ナイキ"
}
},
{
"action": "add",
"id": "id-2",
"ranking": 1,
"fields": {
"title" : "ナイキ"
}
}
]
検索
検索結果
"itemList": {
"item": [
{
"_RELEVANCE": 100,
"_RANK": 1,
"_ID": "id-2",
"title": "<b>ナイキ</b>"
},
{
"_RELEVANCE": 100,
"_RANK": 2,
"_ID": "id-1",
"title": "<b>ナイキ</b>"
}
]
}
設定のダウンロード
設定のアップロード
全データを再インデックスする時はFull indexing APIを使用します。
curl -i -XPOST 'https://kr1-search.api.nhncloudservice.com/indexing/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/indexing/full/begin'
curl -XPOST 'https://kr1-search.api.nhncloudservice.com/indexing/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/indexing/full' -H 'Content-Type:multipart/form-data; charset=UTF-8' -F 'file=@documents-001.json'
curl -i -XPOST 'https://kr1-search.api.nhncloudservice.com/indexing/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/indexing/full/end'
curl -i -XPOST 'https://kr1-search.api.nhncloudservice.com/indexing/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/indexing/full/cancel'
URL
パラメータ
形式 - 単語間をカンマ(',')で区切ります。単語内に空白、セパレータを使用不可
同意語
'靴'検索
Request
curl -i -XPOST 'https://kr1-search.api.nhncloudservice.com/search/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/search?start=1&size=10&q_option=and,productName*1.0&return=productName&q=靴&passage.productName=180'
Response
"itemList": {
"item": [
{
"_ID": "100433865",
"_RANK": "0",
"_RELEVANCE": 100,
"productName": "ブティック リアルラビット スリッパ 毛皮スリッパ オフィス<b>靴</b>"
}
]
}
同義語辞書登録(単方向)
curl -i -XPOST 'https://kr1-search.api.nhncloudservice.com/dictionary/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/dictionary/thesaurus?way=1'
靴,スニーカー,スポーツシューズ
'靴'検索
Request
curl -i -XGET 'https://kr1-search.api.nhncloudservice.com/search/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/search?start=1&size=10&q_option=and,productName*1.0&return=productName&q=靴&passage.productName=180'
Response
"itemList": {
"item": [
{
"_ID": "100433865",
"_RANK": "0",
"_RELEVANCE": 100,
"productName": "ブティック リアルラビット スリッパ 毛皮スリッパ オフィス<b>靴</b>"
},
{
"_ID": "101874425",
"_RANK": "0",
"_RELEVANCE": 1,
"productName": "アイボリードットスニーカー"
},
{
"_ID": "101714054",
"_RANK": "0",
"_RELEVANCE": 1,
"productName": "ナイキ/Nike Free TR 8 - Womens/Nike/機能性 スポーツシューズ/ラファッショニスタ"
}
]
}
Request
curl -i -XGET 'https://kr1-search.api.nhncloudservice.com/search/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/search?start=1&size=10&q_option=and,productName*1.0&return=productName&q=スニーカー&passage.productName=180'
Response
"itemList": {
"item": [
{
"_ID": "101874425",
"_RANK": "0",
"_RELEVANCE": 100,
"productName": アイボリードット<b>スニーカー</b>"
}
]
}
同意語削除(単方向)
curl -i -XDELETE 'https://kr1-search.api.nhncloudservice.com/dictionary/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/dictionary/thesaurus'
靴
Request
curl -i -XGET 'https://kr1-search.api.nhncloudservice.com/search/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/search?start=1&size=10&q_option=and,productName*1.0&return=productName&q=靴&passage.productName=180'
Response
"itemList": {
"item": [
{
"_ID": "100433865",
"_RANK": "0",
"_RELEVANCE": 100,
"productName": "ブティック リアルラビット スリッパ 毛皮スリッパ オフィス<b>靴</b>"
}
]
}
'スニーカー'検索
Request
curl -i -XGET 'https://kr1-search.api.nhncloudservice.com/search/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/search?start=1&size=10&q_option=and,productName*1.0&return=productName&q=スニーカー&passage.productName=180'
Response
"itemList": {
"item": [
{
"_ID": "101874425",
"_RANK": "0",
"_RELEVANCE": 100,
"productName": アイボリードット<b>スニーカー</b>"
}
]
}
同意語 初期化
curl -i -XPOST 'https://kr1-search.api.nhncloudservice.com/dictionary/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/dictionary/thesaurus/reset'
URL
形式
不用語
'コーヒー'検索
Request
curl -i -XGET 'https://kr1-search.api.nhncloudservice.com/search/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/search?start=1&size=10&q_option=and,productName*1.0&return=productName&q=コーヒー&passage.productName=180'
Response
"itemList": {
"item": [
{
"_ID": "100433702",
"_RANK": "0",
"_RELEVANCE": 100,
"productName": "(STANLEY) スタンレーマウンテン<b>コーヒー</b>システム500ミリ"
}
]
}
不用語の事前登録
curl -i -XPOST 'https://kr1-search.api.nhncloudservice.com/dictionary/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/dictionary/stopwords'
コーヒー
コールドブリュー
'コーヒー'検索
Request
curl -i -XGET 'https://kr1-search.api.nhncloudservice.com/search/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/search?start=1&size=10&q_option=and,productName*1.0&return=productName&q=コーヒー&passage.productName=180'
Response
{
"message": {
"result": {
"total": 0,
"query": "コーヒー",
"start": 1,
"status": {
"code": 200,
"message": "OK"
},
"itemCount": 0
},
"meta": {
"timezone": "+09:00"
}
}
}
' コールドブリュー '検索
Request
curl -i -XGET 'https://kr1-search.api.nhncloudservice.com/search/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/search?start=1&size=10&q_option=and,productName*1.0&return=productName&q= コールドブリュー &passage.productName=180'
Response
{
"message": {
"result": {
"total": 0,
"query": " コールドブリュー ",
"start": 1,
"status": {
"code": 200,
"message": "OK"
},
"itemCount": 0
},
"meta": {
"timezone": "+09:00"
}
}
}
不用語の事前削除
curl -i -XDELETE 'https://kr1-search.api.nhncloudservice.com/dictionary/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/dictionary/stopwords'
コールドブリュー
' コールドブリュー '検索
Request
curl -i -XGET 'https://kr1-search.api.nhncloudservice.com/search/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/search?start=1&size=10&q_option=and,productName*1.0&return=productName&q= コールドブリュー &passage.productName=180'
Response
"itemList": {
"item": [
{
"_ID": "101704573",
"_RANK": "0",
"_RELEVANCE": 100,
"productName": "[ブルービクセン] ティモレステ <b>コールドブリュー</b> オランダコーヒー 750ml (高級型)"
}
]
}
不用語辞書の初期化
curl -i -XPOST 'https://kr1-search.api.nhncloudservice.com/dictionary/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/dictionary/stopwords/reset'
フィールドタイプ選択画面は次のとおりです。
形態素解析の選択画面は次のとおりです。
ACL設定画面は次のとおりです。
次はファイルアップロード方式のインデックスのサンプルコードです。
compile group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.5.6'
compile group: 'org.apache.httpcomponents', name: 'httpmime', version: '4.5.6'
package com.toast.cloud.cloudsearch.client;
import org.apache.http.HttpEntity;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.methods.RequestBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
public class IndexingClient {
public static void main(String[] args) throws IOException {
String documents = ""
+ "[\n"
+ " {\n"
+ " \"action\": \"add\",\n"
+ " \"id\": \"id-1\",\n"
+ " \"fields\": {\n"
+ " \"title\": \"[送料無料]ナイキシューズ195種!\",\n"
+ " \"body\": \"ナイキの人気シューズには売れているワケがあります!ナイキの人気シューズ195種★一足は必要じゃないですか?\"\n"
+ " }\n"
+ " }\n"
+ "]";
File tempFile = File.createTempFile("documents-",".json", new File("/tmp/"));
tempFile.deleteOnExit();
PrintWriter printWriter = new PrintWriter(tempFile);
printWriter.println(documents);
printWriter.close();
try (CloseableHttpClient httpclient = HttpClients.createDefault()) {
// build multipart upload request.
HttpEntity data = MultipartEntityBuilder.create()
.setMode(HttpMultipartMode.BROWSER_COMPATIBLE)
.addBinaryBody("file", tempFile, ContentType.DEFAULT_BINARY, tempFile.getName())
.build();
// build http request and assign multipart upload data.
HttpUriRequest request = RequestBuilder
.post("https://kr1-search.api.nhncloudservice.com/indexing/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/indexing")
.setEntity(data)
.build();
.post("https://kr1-search.api.nhncloudservice.com/indexing/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/indexing")
System.out.println("Executing request " + request.getRequestLine());
// Create a custom response handler.
ResponseHandler<String> responseHandler = response -> {
int status = response.getStatusLine().getStatusCode();
if (status >= 200 && status < 300) {
HttpEntity entity = response.getEntity();
return entity != null ? EntityUtils.toString(entity) : null;
} else {
throw new ClientProtocolException("Unexpected response status: " + status);
}
};
String responseBody = httpclient.execute(request, responseHandler);
System.out.println(responseBody);
}
}
}
<?php
$documents = ""
. "[\n"
. " {\n"
. " \"action\": \"add\",\n"
. " \"id\": \"id-1\",\n"
. " \"fields\": {\n"
. " \"title\": \"[送料無料]ナイキシューズ195種!\",\n"
. " \"body\": \"ナイキの人気シューズには売れているワケがあります!ナイキの人気シューズ195種★一足は必要じゃないですか?\"\n"
. " }\n"
. " }\n"
. "]";
$file = DIRECTORY_SEPARATOR.trim(sys_get_temp_dir(), DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.ltrim("documents.json", DIRECTORY_SEPARATOR);
file_put_contents($file, $documents);
register_shutdown_function(function() use($file) {
unlink($file);
});
$data = array(
'file' => curl_file_create($file, "application/json", basename($file))
);
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL,"https://kr1-search.api.nhncloudservice.com/indexing/v2.0/appkeys/CwSx6kv99g0QuNtM/serviceids/test/indexing");
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, array("Content-Type:multipart/form-data; charset=UTF-8"));
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HEADER, true);
$response = curl_exec($ch) or die(curl_error($ch));
print_r($response);
curl_close($ch);
?>