フィールドにインデックスを付けて、上記の例のように「-」を含む文字列を検索すると、Arango はそれを否定演算子として扱い、その文字列を検索しません。「-」を含むこれらの文書を検索する解決策は何ですか?
2 に答える
編集:ソースコードを見に行きました。そこから、「-」が文字列の最初の文字である場合にのみ問題になるように見えます。上記の例の最初の文字ではないので、混乱しています。
「-」文字をエスケープする方法はないようです。「-」の前に「+」を付けることも考えられます。やってみました:
collection.fulltext(attribute, "3da549f0+-0e88+-4297+-b6af+-5179b74bd929");
docsを読んで、 「prefix:」または「complete:」をエスケープとして使用するとうまくいくと推測しました。
collection.fulltext(attribute, "complete:3da549f0-0e88-4297-b6af-5179b74bd929");
しかし、どうやらそうではありません。
あなたがしたことを再現しようとしています。あなたが現在試しているもののより良い再現可能な例(arangoshのみ)を提供すれば、私の答えはおそらくより正確になるでしょう:
http+tcp://127.0.0.1:8529@_system> db._create("testIndex")
http+tcp://127.0.0.1:8529@_system> db.testIndex.ensureIndex({type: "fulltext", fields: ["complete:3da549f0-0e88-4297-b6af-5179b74bd929"]})
{
"fields" : [
"complete:3da549f0-0e88-4297-b6af-5179b74bd929"
],
"id" : "testIndex/4687162",
"minLength" : 2,
"sparse" : true,
"type" : "fulltext",
"unique" : false,
"isNewlyCreated" : true,
"code" : 201
}
http+tcp://127.0.0.1:8529@_system> db.testIndex.save({'complete:3da549f0-0e88-4297-b6af-5179b74bd929': "find me"})
{
"_id" : "testIndex/4687201",
"_key" : "4687201",
"_rev" : "4687201"
}
http+tcp://127.0.0.1:8529@_system> db._query('FOR doc IN FULLTEXT(testIndex, "complete:3da549f0-0e88-4297-b6af-5179b74bd929", "find") RETURN doc')
[object ArangoQueryCursor, count: 1, hasMore: false]
[
{
"_id" : "testIndex/4687201",
"_key" : "4687201",
"_rev" : "4687201",
"complete:3da549f0-0e88-4297-b6af-5179b74bd929" : "find me"
}
]
したがって、ユースケースは異なって見えます:
db.test2.save({id: 'complete:3da549f0-0e88-4297-b6af-5179b74bd929'})
db.test2.ensureIndex({type: "fulltext", fields: ["id"]})
db._query('FOR doc IN FULLTEXT(test2, "id", "3da549f0-0e88-4297-b6af-5179b74bd929") RETURN doc')
これは空の結果を返します。
何が起こっているのかを理解するには、フルテキスト インデックスがどのように機能するかを知る必要があります。単語の境界でテキストを分割し、インデックス内のドキュメントへの参照を含むリストとして保存します。その索引グローバル単語リスト内の 1 つの単語によって、複数の文書が参照される場合があります。
インデックスがクエリされると、要求された単語がインデックスのグローバル単語リストで検索され、見つかった各単語には、その単語を含むドキュメントのリストが含まれます。これらのバケットは結合され、反復されるドキュメントの合計リストとして返されます。
トークナイザーをもう少しよく理解するために、それを呼び出す小さな js ラッパーを追加しました。
それがあなたの文字列に何をするか見てみましょう:
SYS_SPLIT_WORDS_ICU("ab cd", 0)
[
"ab",
" ",
"cd"
]
SYS_SPLIT_WORDS_ICU("3da549f0-0e88-4297-b6af-5179b74bd929", 0)
[
"3da549f0",
"-",
"0e88",
"-",
"4297",
"-",
"b6af",
"-",
"5179b74bd929"
]
ご覧のとおり、マイナスは単語の境界として扱われ、文字列は分割されます。これを回避する機会がいくつかあります。
- 挿入時にマイナスを削除します
- 検索文字列を分割し、ハッシュの最も意味のある部分を使用し、その後に実際の値の FILTER ステートメントを使用します
- これにはフルテキスト インデックスを使用せず、スキップリストまたはハッシュ インデックスを使用します。維持費が安く、FILTER ステートメントに使用できます。