密なベクトルをインデックスしようとした際のSolrインデックスエラー

トピック作成者:ks-solruserml-bot (2024/12/28 18:53 投稿)
6
OpenOpen

(The bot translated the original post https://lists.apache.org/thread/yrg1h2ork6gh78y2j8q1t4y8z5fnv64z into Japanese and reposted it under Apache License 2.0. The copyright of posted content is held by the original poster.)

こんにちは、

私はSolr 9.1を使用して密なベクトルフィールドをインデックスしようとしていますが、インデックスエラーが発生しています。エラーは、ベクトル内に完全に一致する値がある場合、それらが1つの値にまとめられ、ベクトルの長さが減少するというものです。私のフィールド「embedding_vec」はスキーマで200の長さのknn_vectorとして次のように定義されています:

<fieldType name="knn_vector" class="solr.DenseVectorField" vectorDimension="200" similarityFunction="cosine"/>
<field name="embedding_vec" type="knn_vector" indexed="true" stored="false"/>

この状態で、長さ200の入力値を渡すと、完全に一致する4つの重複値があるため、Solrはその長さが196であるとエラーを返します。重複値の3つが削除されることも確認しました。私の入力は次の通りです:

[入力値]

そして、Solrはこれを次のように変換しています:

[Solrによって変換されたベクトル]

エラーのコールスタックは次のようになります:

org.apache.solr.update.DocumentBuilder.toDocument(DocumentBuilder.java:246)
at org.apache.solr.update.DocumentBuilder.toDocument(DocumentBuilder.java:100)
at org.apache.solr.update.AddUpdateCommand.lambda$makeLuceneDocs$0(AddUpdateCommand.java:233)
at java.base/java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:197)
at java.base/java.util.ArrayList$ArrayListSpliterator.tryAdvance(ArrayList.java:1602)
at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.lambda$initPartialTraversalState$0(StreamSpliterators.java:292)
at java.base/java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.fillBuffer(StreamSpliterators.java:206)
at java.base/java.util.stream.StreamSpliterators$AbstractWrappingSpliterator.doAdvance(StreamSpliterators.java:161)
at java.base/java.util.stream.StreamSpliterators$WrappingSpliterator.tryAdvance(StreamSpliterators.java:298)
at java.base/java.util.Spliterators$1Adapter.hasNext(Spliterators.java:681)
at org.apache.lucene.index.DocumentsWriterPerThread.updateDocuments(DocumentsWriterPerThread.java:232)
at org.apache.lucene.index.DocumentsWriter.updateDocuments(DocumentsWriter.java:432)
at org.apache.lucene.index.IndexWriter.updateDocuments(IndexWriter.java:1532)
at org.apache.lucene.index.IndexWriter.updateDocuments(IndexWriter.java:1521)
at org.apache.solr.update.DirectUpdateHandler2.updateDocOrDocValues(DirectUpdateHandler2.java:1048)

この問題について、どのように解決すればよいかアドバイスをいただけますか?

返信投稿者:ks-solruserml-bot (2024/12/28 18:53 投稿)

こんにちは、

数週間前に私も同じ問題が発生しました。その原因は「UniqFiledsUpdateProcessorFactory」でした。
「solrconfig.xml」を確認して、この更新プロセッサが関与していないか確認してみてください。このプロセッサは、通常、重複を削除します(ベクター内でも!)。

https://issues.apache.org/jira/browse/SOLR-17487?focusedCommentId=17888974&page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-17888974

Guillaume

返信投稿者:ks-solruserml-bot (2024/12/28 18:53 投稿)

ありがとう!うまくいきました。私は、KNNベクターを除いて、すべてのデータに対して重複排除メカニズムを維持したかったので、最終的に埋め込みフィールド(すべてembedding_*という名前)が重複排除のメカニズムから除外されるようにしました。

<processor class="solr.UniqFieldsUpdateProcessorFactory">
  <str name="fieldRegex">(?!.*embedding).*< /str>
</processor>

Arun

返信投稿者:ks-solruserml-bot (2024/12/28 18:53 投稿)

問題が解決してよかったです!

返信投稿者:ks-solruserml-bot (2024/12/28 18:54 投稿)

毎回フィールド名に対してその正規表現を評価することによるCPU負荷を軽減するために、'typeClass' セレクターを使うことができます。例えば、次のように...

<processor class="solr.UniqFieldsUpdateProcessorFactory">
  <lst name="exclude">
    <str name="typeClass">solr.DenseVectorField</str>
  </lst>
</processor>

https://solr.apache.org/docs/9_7_0/core/org/apache/solr/update/processor/FieldMutatingUpdateProcessorFactory.html

-Hoss
http://www.lucidworks.com/

返信投稿者:ks-solruserml-bot (2024/12/28 18:54 投稿)

素晴らしいです!ありがとう!

返信投稿者:ks-solruserml-bot (2024/12/28 18:54 投稿)

ありがとう、Chris! それは素晴らしいヒントですね!

トピックへ返信するには、ログインが必要です。

KandaSearch

Copyright © 2006-2025 RONDHUIT Co, Ltd. All Rights Reserved.

投稿の削除

この投稿を削除します。よろしいですか?