1

オートコンプリート検索機能を必要とするアプリケーションを構築しています。私はLucene 4.2.1実装を使用RegexQueryしており、オートコンプリートの検索を行うために利用しています。私の要件は、ユーザーが複数の用語(例: cafe coffee day)を含む検索クエリを入力した場合、その用語に少なくとも 3 文字が含まれる場合にのみ、任意の用語の入力を検索対象と見なす必要があるということです。

例: ユーザーがすでにcafeという単語を入力しており、今はcoffeeと入力し始めているが、 cまたはcoまでしか入力していない場合、サーチャーはこれらのトークンを正規表現クエリと見なすべきではありません。

どうすれば望ましい効果を達成できるか教えてください。用語の検証のようなものを指定QueryParserして、生成されたクエリで 3 文字未満の用語を無視するかsearcher、特定のQuery.

4

2 に答える 2

1

オートコンプリートと正規表現クエリを組み合わせるよりも、Lucene Suggest APIを参照することをお勧めします。

それを除けば、現在の実装がどのように機能するかについてはあまり言いません。ただし、現在の単語が 2 文字しか入力されていないときに検索したくない場合は、単に search を呼び出さないでください。

検索したいが、2 文字以下のすべての単語を無視したいという場合は、標準のトークン化されたクエリを使用し、LengthFilterでアナライザーを適用することをお勧めします。カスタムAnalyzerをまとめる方法がわからない場合は、次のような Lucene ドキュメントの例から作業してください。

Analyzer analyzer = new Analyzer() {
 @Override
  protected TokenStreamComponents createComponents(String fieldName, Reader reader) {
    Tokenizer source = new FooTokenizer(reader); //ex. StandardAnalyzer
    TokenStream filter = new FooFilter(source); //ex. StandardFilter, LowercaseFilter, StopFilter, etc.
    filter = new BarFilter(filter);
    filter = new LengthFilter(true, filter, 3, Integer.MAX_VALUE);
    return new TokenStreamComponents(source, filter);
  }
};

正規表現クエリに関しては、" this and that a.*" を " this and that.*" に変換する必要がある場合は、その変換を自分で実装する必要があります。

于 2013-04-29T15:38:59.123 に答える