2

solr文字列フィールドを使用してテキストフィールドに完全に一致させています(テキストフィールドの種類を確認しましたが、うまくいくとは思いません。スペースやワイルドカードなど、SQLのLIKE機能を正確に再現したいと思います)。

私の問題は、大きなテキストフィールドにインデックスを付けると、これらのフィールドを検索するときにSolrがデータを返さないことです。制限はint16.maxのようです。

idテストとして、フィールドとフィールドを使用してインデックスを作成しましたstringidフィールドが「1」で、stringフィールドに40,000文字が含まれている場合:

  • id:1インデックスが作成されたことを示す40,000文字の両方のフィールドを返します。
  • string:*結果を返しません

文字列フィールドに30,000文字しか含まれていない場合は、すべて正常に機能しているようです。

maxFieldLengthが4.0で削除され、文字列フィールドがアナライザーをサポートしていないため、これが制限であると述べているドキュメントも、それを回避する方法も見つかりません。

他の誰かがこの問題に遭遇したか、回避策を見つけましたか?

4

1 に答える 1

2

私はこれに多くの時間を費やしたので、他の誰かがこの問題に遭遇した場合に備えて、私が思いついた解決策を投稿しています。キーワードトークンライザーでテキストフィールドタイプを使用すると、文字列フィールドタイプと同じように機能し、文字列フィールドタイプで遭遇した長さの制限まで機能しました。

最終的に、いくつかの変更を加えてこのスレッドを読んだ後、カスタムトークナイザーを作成しました。

  1. 彼は標準の動作を望んでいたので、彼はStandardTokenizerに基づいていますが、私はそれを文字列フィールドのように動作させたいと思っていました。私は最初にKeywordTokenizerを使用しようとしましたが、それでも制限に達したため、最終的にはWhitespaceTokenizerをベースにしました(以下で詳しく説明します)。

  2. そこにあるコードは古く、Solr4.0では機能しません。

isTokenCharWhitespaceTokenizerのコードは非常に短く、 returnsと呼ばれるメソッドが含まれています!Character.isWhitespace(c);。これを変更して、常にtrueを返すようにしました。その後、TokenizerFactoryを作成してそれを返し、リンクされたスレッドと同じ方法でschema.xmlで参照しました。

MyCustomTokenizer.java:

package custom.analysis;

import java.io.Reader;
import org.apache.lucene.analysis.Tokenizer;
import org.apache.lucene.analysis.util.CharTokenizer;
import org.apache.lucene.util.AttributeSource;
import org.apache.lucene.util.Version;

public final class MyCustomTokenizer extends CharTokenizer {

  public MyCustomTokenizer(Version matchVersion, Reader in) {
    super(matchVersion, in);
  }

  public MyCustomTokenizer(Version matchVersion, AttributeSource source, Reader in) {
    super(matchVersion, source, in);
  }

  public MyCustomTokenizer(Version matchVersion, AttributeFactory factory, Reader in) {
    super(matchVersion, factory, in);
  }

  @Override
  protected boolean isTokenChar(int c) {
    return true; //!Character.isWhitespace(c);
  }
}

MyCustomTokenizerFactory.java:

package custom.analysis;

import org.apache.lucene.analysis.util.TokenizerFactory;
import org.apache.lucene.analysis.core.KeywordTokenizerFactory;
import org.apache.lucene.analysis.core.KeywordTokenizer;

import java.io.Reader; 
import org.apache.lucene.util.Version;


public class MyCustomTokenizerFactory extends TokenizerFactory {
  public MyCustomTokenizer create(Reader input) { 
    final MyCustomTokenizer tokenizer = new MyCustomTokenizer(Version.LUCENE_40, input); 
    return tokenizer; 
  } 
} 

schema.xml:

<fieldType name="text_block" class="solr.TextField" positionIncrementGap="100"> 
   <analyzer> 
     <tokenizer class="custom.analysis.MyCustomTokenizerFactory" />        
   </analyzer> 
</fieldType> 

このアプローチを使用して、文字列フィールドなどの機能で大きなテキストフィールド(> 100k文字)にインデックスを付けることができました。誰かがより良い方法を見つけたら、それを投稿してください!

于 2013-03-12T17:57:31.917 に答える