2016-04-20 3 views
1

フィールドにインデックスを付け、上記の例のように ' - 'を含む文字列を検索すると、Arangoはそれを否定演算子として扱い、その文字列を検索しません。 「 - 」を含むこれらの文書を検索する解決策は何ですか?「3da549f0-0e88-4297-b6af-5179b74bd929」のように、文字列に ' - 'が含まれている場合、フルテキスト検索を行うにはどうすればよいですか?

+2

この問題はhttps://github.com/arangodb/arangodb/issues/928でこの質問に答えることができます。 – Dongqing

+1

この種のデータで全文索引を使用するのはなぜですか?平等( '==')でフィルタリングする場合は、代わりにハッシュインデックスを使用します。プレフィックス検索( "〜で始まる")を実行する必要がある場合は、いくつかの創造性を持ったスキップリストインデックスを利用することができます。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

答えて

1

あなたがしたことを再現しようとしています。

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ステートメントに使用できます
+0

私はあなたが私の意見を誤解していると思います。私のフィールドは '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'私には結果がありません –

+0

私はそれに応じて答えを更新しました。 – dothebart

+0

私の値が "-11"の場合、もう1つ質問すれば、フルテキストインデックスはどのようにこの値を見つけることができますか.......私はハッシュやインデックスをスキップするのではなくフルテキストインデックスを使用したいと思います。 –

1

編集: 私はちょうどthe source codeを見に行きました。そこから、 ' - 'は文字列の最初の文字であれば問題になるはずです。あなたが上に挙げた例の最初の文字ではないので、私は混乱しています。 「 - 」文字

は、エスケープのいずれかの方法があるがあり見ていません。もう一つの考え方は、 ' - 'の前に '+'を付けることです。あなたは試してみました:「完全:」または:「プレフィックスを」エスケープが働くかもしれないとして

collection.fulltext(attribute, "3da549f0+-0e88+-4297+-b6af+-5179b74bd929"); 

は、私が使用していることを、the docsを読んでから推測しました。

collection.fulltext(attribute, "complete:3da549f0-0e88-4297-b6af-5179b74bd929"); 

しかし明らかにそうではありません。

+0

はい私は両方で試しました.....それは動作しません –

+0

私は私の答えを更新しました。これは実際に使用しているクエリですか?ソースコードは、クエリーの途中ではなく、(カンマまたはスペースの後に)単語の先頭にある ' - 'のみを扱うように見えるので、 –

+0

このクエリを試してみます。 –

関連する問題