text
索引の詳細
フルテキスト索引の基本的な前提は、文書が Lucene によって索引付けされた key:value
ペアのリストに「展開」されていることです。 この展開により、Lucene の検索構文を照会機能の基礎として使用できます。
この手法は拡張検索をサポートしますが、特定の制限があります。 例えば、展開された文書のコンテンツが個々の要素と配列のどちらからのものであるかは、常に明確であるとは限りません。
照会メカニズムは、「誤検出」の結果を返すよう選択することにより、この不確実性を解決します。 つまり、個々の要素または配列の要素のいずれかを検索したために一致が検出された場合、マッチングは成功と見なされます。
IBM® Cloudant® for IBM Cloud® 検索索引と同様に、 IBM Cloudant type: text
の照会索引は、照会時に 200 件の結果に制限されます。
セレクター変換
標準の Lucene 検索式では、必要な JSON ベースの IBM Cloudant 照会構文を完全には実装しない場合があります。 そのため、2 つのフォーマット間の変換が行われます。
以下の例では、JSON 照会は英語の句「Match if the age expressed as a number is greater than five and less than or equal to infinity.」に近似します。 Lucene 照会はその句に対応します。ここで、フィールド名内のテキスト_3a
は age:number
フィールドに対応し、前述の文書コンテンツの展開の例です。
変換される照会の例を以下に示します。
{
"age": {
"$gt": 5
}
}
対応する Lucene 照会
(age_3anumber:{5 TO Infinity])
より複雑な例
以下の例では、いくつかの重要なポイントを示します。
Lucene に変換される JSON 照会
{
"$or": [
{
"age": {
"$gt": 5
}
},
{
"twitter": {
"$exists":true
}
},
{
"type": {
"$in": [
"starch",
"protein"
]
}
}
]
}
JSON 照会の最初の部分は、Lucene に変換するのが簡単です。 テストにより、
age
フィールドの数値が 5 より大きいかどうかが判別されます。 範囲式の {
文字は、値 5 が一致と見なされないことを意味します。
Lucene で JSON 照会の "twitter": {"$exists":true}
部分を実装するには、最初のテストで twitter
フィールドが存在するかどうかを判別します。 ただし、フィールドは配列またはオブジェクトのいずれかである可能性があるため、値が配列
または オブジェクトの場合は、マッチングが成功する必要があります。
この要件は、$fieldnames
フィールドに twitter.*
または twitter:*
のいずれかを含むエントリーが含まれている必要があることを意味します。
.
文字は、照会では ASCII 文字シーケンス_2e
として表されます。 同様に、
:
文字は、照会内で ASCII 文字シーケンス _3a
として表されます。 この表現では、
OR
フィールドに twitter
および _2e*
で終わる 2 つの節 _3a*
照会を使用する必要があります。 この照会を単一の twitter*
照会の代わりに 2 つの句として実装すると、twitter_handle
などのフィールド名と偶発的に一致することがなくなります。
3 つのメイン節の最後は、starch
または protein
の検索です。 この検索はより複雑です。
$in
演算子には、MongoDB の動作から継承される配列値の特殊なセマンティクスがあります。 特に、
$in
演算子は、値またはフィールドで指定された配列に含まれるいずれかの値に適用されます。 この例では、式は、
"type":"starch"
と "type":["protein"]
の両方が $in
の引数の例と一致することを意味します。 以前は、
type_3astring
式は type:string
に変換されていました。 2 番目のtype_2e_5b_5d_3astring
句はtype.[]:string
に変換されます。これは、拡張配列の索引付けの例です。
対応する Lucene 照会の説明
"#" コメントは Lucene 構文として有効ではありませんが、照会構造の説明に役立ちます。
(
# Search for age > 5
(age_3anumber:{5 TO Infinity])
# Search for documents that contain the twitter field
(($fieldnames:twitter_2e*) OR ($fieldnames:twitter_3a*))
# Search for type = starch
(
((type_3astring:starch) OR (type_2e_5b_5d_3astring:starch))
# Search for type = protein
((type_3astring:protein) OR (type_2e_5b_5d_3astring:protein))
)
)