こんにちは、なかやまです。
最近お仕事でCloudSearchを利用する機会がありました。
CloudSearchはAWSが提供する検索サービスになります。
前回もご紹介したのですが、もう少し躓いたところがあるのでお話させてください。
では、色々つまづいた・誤解していた事です↓
複雑な検索もできるよ
クエリパーサーは4つ。
・simple・・・簡易テキスト検索
・structured・・・高度な検索(今回はこちらを利用)
・lucene(るしーん)・・・Apache Lucene クエリパーサーの構文を使用
・dismax・・・DisMax のクエリパーサーで定義された Apache Lucene のクエリパーサー構文の簡略化されたサブセットを使用
Apache Solrを知らなかったのですが、Solrを使っているシステムは移行が簡単そうにみえますね。
https://docs.aws.amazon.com/ja_jp/cloudsearch/latest/developerguide/searching.html
Boolean型ってないんだ・・
登録できるデータ型はテキスト、リテラル、数値、小数、日付、地理、配列です。
Booleanとして使いたかったものは、リテラル型にtrue,falseとか0,1を入れて対応しました。
テキスト型にはそれぞれ言語設定ができるよ。
ドキュメント消したいときはどうするの?
バッチでdeleteのJSON投げればOK
CloudSearch上はドキュメントIDで一意になるように指定します。
アップロードはcsvでできるの?できないの?
コンソール&コマンドラインツールからはcsvOK。ドキュメントバッチはJsonかXML形式だけです。1回の送信サイズ最大5Mになるように調整しよう。
項目の設定でreturnにチェックをはずすと、コンソール画面から叩いても、結果がわからなくなったよ。
表示項目として利用しないものだったので、returnのチェックを外した所コンソール画面から検索したときに値の確認ができなくなりました。検索結果のjsonには、returnにチェックの入った項目しか返却されません。
コンソール画面からは確認できるのではないかと、思い込んでマシタ。
検索条件に指定することで値が設定されていることは確認できましたが、まずは全部returnチェックをして正しく登録されていることを確認してから、returnチェックを省いたほうがよかったかな。
項目にnullって登録できないの?
登録するjsonにて項目をブランクで登録した所、検索結果からは項目自体が抹消されてまいした。呼び出し側では項目がない場合の制御が必要ですね。
特定の項目だけ更新したかったのに
毎日特定の列だけ更新したいことがありました。よし、特定の項目だけ更新すればバッチの時間短縮だよね!と思っていたのですが、どうやら特定の項目だけ更新はできないようです。残念。
選択したフィールドだけを更新することはできません。ドキュメントは新しいバージョンで上書きされます
日本語検索の仕様がわかりにくい
今までテキスト検索といったら、SQLのLIKE条件を使う程度でした。CloudSearchでは項目ごとに言語設定ができるんです。その設定によって、検索結果が変わってきます。
・Multiple Language ・・・ N-Gram検索(2文字ずつ区切る) 京都で検索すると、東京と京都がhitするもの
・Japanease ・・・ 日本語形態素解析 京都で検索すると京都しかhitしないもの
どうやってインデックス作ってるの?
1.トークン分割・・・スペース・タブ・空白文字・ハイフン・記号(@)でも分割。下線、コロン、カンマは分割されない。キャメルケースも分割されず。
2.標準化・・・大文字→小文字
3.ステミング・・・インデックスに含まれる用語の数を減らす
4.ストップワード・・・インデックス作成時にも検索時にも無視される単語
5.シノニム・・・検索しているデータ内に存在する用語に対してシノニムを設定できます
※辞書の設定はコマンドから
http://docs.aws.amazon.com/ja_jp/cloudsearch/latest/developerguide/text-processing.html
検索するときにも同じテキスト処理をかけて検索するそうです。
プレフィックス検索だと検索用語でテキスト処理をしないそうです。
完全一致のみ利用するのであれば、リテラル型で定義すればよいそう。なるほど。
で、ドキュメント登録にどのぐらい時間がかかるの?
アップロードするドキュメントのサイズとインデックス作成する項目数によります。
今回ネックになったのは送信元となるjsonファイルの作成にかかった時間でした。cloudsearchに投げる前ですね。
jsonファイルができたら、並列投入することでオートスケールしてくれます。
公式ドキュメントには数十秒〜数分とかいてますが、そのとおりだと思います。
今回はここまで。