フィールドにインデックスを付け、上記の例のように ' - 'を含む文字列を検索すると、Arangoはそれを否定演算子として扱い、その文字列を検索しません。 「 - 」を含むこれらの文書を検索する解決策は何ですか?「3da549f0-0e88-4297-b6af-5179b74bd929」のように、文字列に ' - 'が含まれている場合、フルテキスト検索を行うにはどうすればよいですか?
答えて
あなたがしたことを再現しようとしています。
http+tcp://127.0.0.1:[email protected]_system> db._create("testIndex")
http+tcp://127.0.0.1:[email protected]_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:[email protected]_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:[email protected]_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')
れます(のみarangosh付き)より良い再現性の例を提供する場合私の答えは、おそらくあなたが現在しようとしている何より正確かもしれません空の結果を返します。起こっていただきまし理解する
、一つはフルテキストインデックスがどのように動作するかを知っている必要があります。それはword boundariesにテキストを分割し、これを索引の文書への参照を含むリストとして保管します。その索引 - グローバル・ワードリスト内の1ワードで複数の文書を参照することができます。
インデックスが照会されると、要求された単語が索引グローバル・ワードリスト内で検索され、見つかった各単語にはその中に単語が含まれている文書のリストが含まれます。これらのバケットは結合され、反復される文書の合計リストとして返されます。 the tokenizer a little better, I've added a tiny js wrapper that invokes itを理解することが
。
は、それはあなたの文字列に何をするかを見てましょう:
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ステートメントに使用できます
私はあなたが私の意見を誤解していると思います。私のフィールドは 'id'で、値は '3da549f0-0e88-4297-b6af-5179b74bd929'です。ですから、 'ida'フィールドにインデックスを付けて '3da549f0-0e88-4297-b6af-5179b74bd929'という用語を検索しなければなりません。私は 'id'の索引付けを行っており、 'prefix:3da549f0'を検索することができましたが、 'prefix:3da549f0-0e88-4297-b6af-5179b74bd929'または 'complete:3da549f0-0e88-4297-b6af-5179b74bd929'私には結果がありません –
私はそれに応じて答えを更新しました。 – dothebart
私の値が "-11"の場合、もう1つ質問すれば、フルテキストインデックスはどのようにこの値を見つけることができますか.......私はハッシュやインデックスをスキップするのではなくフルテキストインデックスを使用したいと思います。 –
編集: 私はちょうどthe source codeを見に行きました。そこから、 ' - 'は文字列の最初の文字であれば問題になるはずです。あなたが上に挙げた例の最初の文字ではないので、私は混乱しています。 「 - 」文字
は、エスケープのいずれかの方法があるがあり見ていません。もう一つの考え方は、 ' - 'の前に '+'を付けることです。あなたは試してみました:「完全:」または:「プレフィックスを」エスケープが働くかもしれないとして
collection.fulltext(attribute, "3da549f0+-0e88+-4297+-b6af+-5179b74bd929");
は、私が使用していることを、the docsを読んでから推測しました。
collection.fulltext(attribute, "complete:3da549f0-0e88-4297-b6af-5179b74bd929");
しかし明らかにそうではありません。
はい私は両方で試しました.....それは動作しません –
私は私の答えを更新しました。これは実際に使用しているクエリですか?ソースコードは、クエリーの途中ではなく、(カンマまたはスペースの後に)単語の先頭にある ' - 'のみを扱うように見えるので、 –
このクエリを試してみます。 –
- 1. 文字列にリストの文字列が含まれているかどうかを検証するにはどうすればよいですか?
- 2. アラビア文字を含む文字列を検索するにはどうすればよいですか?
- 3. 文字列に右から左の文字が含まれているかどうかを検出するにはどうすればよいですか?
- 4. Perlでフラットファイルのフルテキスト検索を行うにはどうすればよいですか?
- 5. 文字列に '/'が含まれている場合、どのように '///'を使用できますか?
- 6. appwayスクリプトで文字列に部分文字列が含まれているかどうかを確認するにはどうすればよいですか?
- 7. Ruby on Railsでフルテキスト検索を行うにはどうすればよいですか?
- 8. 文字列に英数字以外の文字が含まれているかどうかを確認するにはどうすればよいですか?
- 9. Bashの場合文字列が配列に含まれていない場合はどうなりますか?
- 10. 検索結果に続いて文字列をラップするにはどうすればよいですか?
- 11. ブラウザの「改行」の表現に2文字が含まれているかどうかを検出するにはどうすればよいですか?
- 12. 検索している文字列がファイルにリストされているかどうかを確認するにはどうすればよいですか?
- 13. 文字列にGoのアルファベット文字のみが含まれているかどうかを確認するにはどうすればよいですか?
- 14. 良いSQL検索を行うにはどうすればよいですか?
- 15. 文字列に文字列がない場合はどうすれば検出できますか?
- 16. Java - 文字列のアルファベット以外の文字を検索するにはどうすればよいですか?
- 17. 文字列に文字のリストが含まれているかどうかを確認するにはどうすればよいですか?
- 18. 文字列に特定の文字が含まれているかどうかを確認するにはどうすればよいですか?
- 19. 文字列の繰り返し文字を検索するにはどうすればよいですか?
- 20. コマンド出力に特定の文字列が含まれているかどうかを(1行で)テストするにはどうすればよいですか?
- 21. 文字列に特殊文字が含まれているかどうかを確認するにはどうすればよいですか?
- 22. 文字列が前方に含まれている場合は、私は、文字列にスラッシュが含まれているかどうかを確認するif文を作るにはどうすればよい
- 23. 複数の検索を行うにはどうすればよいですか?
- 24. 動的に追加された文字列を検索するにはどうすればよいですか?
- 25. ファイルに含まれているコンテンツを検索するにはどうすればよいですか?
- 26. 特定の値で始まる文字列を検索するにはどうすればよいですか?
- 27. Rでは、特定の文字列に含まれる文字ベクトル要素を検索するにはどうすればよいですか?
- 28. 文字列に別の文字列がどの位置に含まれているか把握するにはどうすればよいですか?
- 29. ロールのIEnumerableに文字列配列のロールが含まれているかどうかを確認するにはどうすればよいですか?
- 30. JavaScriptでは、入力に文字が含まれているかどうかを検出するにはどうすればよいですか?
この問題はhttps://github.com/arangodb/arangodb/issues/928でこの質問に答えることができます。 – Dongqing
この種のデータで全文索引を使用するのはなぜですか?平等( '==')でフィルタリングする場合は、代わりにハッシュインデックスを使用します。プレフィックス検索( "〜で始まる")を実行する必要がある場合は、いくつかの創造性を持ったスキップリストインデックスを利用することができます。http://stackoverflow.com/questions/35587746/on-multiple-index-usage- in-arangodb、https://docs.arangodb.com/cookbook/PopulatingAnAutocompleteTextbox.htmlを参照してください。接尾辞の検索( "ends with ...")では、文字列[REVERSE()](https://docs.arangodb.com/Aql/StringFunctions.html)を保存し、接頭辞と同じテクニックを適用することも検討してください検索。 – CoDEmanX