2017-02-07 8 views
1

私の目的は、章/詩ベースの検索機能を提供することです。私はそれに関連する本、章、および詩参照があるコンテンツを持っています。検索者のような検索語を介してコンテンツを見つけることができるようにするために私が欲しい:弾性検索での聖句ベース検索の構成方法

  • Luke - すべての本のための - 書籍/章
  • Luke 1-5のためのすべて - 一致していることを本
  • Luke 1ためのすべての結果をそして、の章Luke 1:13
  • 間 - 聖書、その範囲内に、この節の範囲を有する任意のコンテンツ -
  • Luke 1:2-7その範囲内に、この章/節を有する任意のコンテンツ

LIKE '%%'を使用してmysqlでこれを達成するには、非常に扱いにくく、リレーションシップでかなりの複雑さが必要で、ちょうど正しい解決策ではないようです。

Elasticsearchはこのようなことの方がはるかに優れているようですが、私は経験豊かな開発者からデータ構造の観点からこれをどのように達成するかについて意見を得たいと考えています。

可能な個々の詩(Luke 1:2、Luke 1:3、Luke 1:4)を保存するための最善の方法はありますか、または弾性検索に詩の範囲を教える方法があります4)それは私のために仕事をしますか?

+0

どのようにデータモデルを弾力性のあるようにモデル化していますか?あなたはいくつかのモデルを共有できますか? – user3775217

+0

@ user3775217まだ分かりませんが、それは質問の一部です – Webnet

答えて

1

これらの検索クエリをElasticsearchフィルタに変換するには、薄層ロジックが必要になると思います。これよりも優れた解決策があるかもしれません(私は分析フィールドとLuceneであまり働かない)が、これは私の心に来るものです。

第1のオプションは、それほど多くない31k文書を作成する1つの文書/詩を作成することです。これは照会する最も簡単なデータモデルです。

新約聖書には、旧約聖書には23,145節、 には7,957節があります。これは、あなたは、他のオプションは、ネストされた文書として詩を格納することです31102の詩

{ 
    "book": "Luke" 
    "chapter": 1, 
    "verse": 13, 
    "contents": "But the angel said to him: Do not be afraid, Zechariah; your prayer has been heard. Your wife Elizabeth will bear you a son, and you are to call him John." 
} 

(私はそれがまた、ESのマッピングのキーワードであるとしてフィールドが"text"と呼ばれた嫌い。)

の合計を与えます「1つの文書/章を取得するd次の

{ 
    "book": "Luke" 
    "chapter": 1, 
    "verses": [ 
    { 
     "verse": 12, 
     "contents": "..." 
    }, 
    { 
     "verse": 13, 
     "contents": "But the angel said to him: Do not be afraid, Zechariah; your prayer has been heard. Your wife Elizabeth will bear you a son, and you are to call him John." 
    }, 
    { 
     "verse": 14, 
     "contents": "..." 
    } 
    ] 
} 

第三の選択肢は一つの文書/本を持っていることです。

{ 
    "book": "Luke" 
    "verses": [ 
    { 
     "chapter": 1, 
     "verse": 12, 
     "contents": "..." 
    }, 
    { 
     "chapter": 1, 
     "verse": 13, 
     "contents": "But the angel said to him: Do not be afraid, Zechariah; your prayer has been heard. Your wife Elizabeth will bear you a son, and you are to call him John." 
    }, 
    { 
     "chapter": 1, 
     "verse": 14, 
     "contents": "..." 
    } 
    ] 
} 

実際にはネストされたドキュメントもドキュメントとしてカウントされ、"book"フィールドはルートドキュメントと共有するだけなので、ネストしてもほとんど得られません。だから私はオプション#1に行くだろう。

ES/Luceneがこのようなテキストのタグ付け部分をサポートしているかどうかはわかりませんが、ドキュメント/ブックは1つしかありません。ページ番号を保存することも同様の問題で、人々は1つのドキュメント/ページを保存するように提案しました。

アップデート:私は、有効なquery stringクエリを構築することができると思いKibanaの私の使用状況に基づいて

{ 
    "query": { 
    "query_string" : { 
     "query" : "book:\"Luke\" AND chapter:3 AND verse:[5 TO 13]", 
     "use_dis_max" : false 
    } 
    } 
} 

私の理解dis_maxで唯一の「検索」(得点とランキングに関連しています)コンテキストであるが、ここでは完全一致をフィルタリングしているので、falseに設定することができる。

+0

これは大変感謝しています! #1を使用してクエリをどのように行うかの例を教えていただけますか?私は、ElasticSearchをMySQLよりも使用することで付加価値を重視しています。具体的には、それが検索の詩の範囲の部分を処理するか、私がESを使用した場合でも何とか自分自身で行う必要があるかどうかを理解したいと思います。 – Webnet

+0

私は例を追加しましたが、わずか31kの節があり、すべての例がSQLで実装するのは簡単ではないので、ESがあなたに何か利益をもたらすかどうかはわかりません。 「重要な用語」集約(他の言語と比較してルークの本で頻繁に使用される言葉を参照)や節の自由なテキスト検索など、より面白い使用事例をサポートします。 – NikoNyrh

+0

Nikoありがとう、私は本当にあなたの経験からこのシナリオを見て時間を割いていただきありがとうございます! – Webnet