2017-05-03 19 views
3

私はLuceneをアプリケーションに統合しようとしています。 Luceneは現在、「アップロード」を検索していて、ドキュメントに「アップロード」というテキストがあり、それがうまく動作していますが、「Uplo」を検索すると機能しません。何か案は?Lucene:部分的な単語で検索

コード:

Directory directory = FSDirectory.open(path); 
       IndexReader indexReader = DirectoryReader.open(directory); 
       IndexSearcher indexSearcher = new IndexSearcher(indexReader); 

       QueryParser queryParser = new QueryParser("contents", new SimpleAnalyzer()); 
       Query query = queryParser.parse(text); 
       TopDocs topDocs = indexSearcher.search(query, 50); 
       for (ScoreDoc scoreDoc : topDocs.scoreDocs) { 
        org.apache.lucene.document.Document document = indexSearcher.doc(scoreDoc.doc); 
        objectIds.add(Integer.valueOf(document.get("id"))); 
        System.out.println(""); 
        System.out.println("id " + document.get("id")); 
        System.out.println("content " + document.get("contents")); 
       } 
       return objectIds; 

はありがとうございます。

答えて

2

Luceneインデックスに「アップロード」というONEトークンがあります。トークンは、分割できない最小のエンティティになります。あなたが 'Uplo'のような部分的な単語に一致させたい場合は、Lucene NGram Indexingの方がいいです。 NGramの索引付けを行う場合は、逆索引のために必要な領域が増えます。

+0

ありがとう、私はそれを確認します、現在それはワイルドカード文字で動作していますが、検索フレーズが数字を含むたびに、私は結果を戻していません。何か案は?ありがとうございました。 –

+0

はい、Luceneの場合、トークンはトークンですが、そのすべて英語か英数字かは関係ありません。たとえあなたのトークンに番号が含まれていても、例えばBond777を検索して777を検索すると、NGramを使用した場合、Bond777が結果として得られます。ここでの利点は、 'nd77'のような真ん中の文字を検索することもでき、正しい結果が得られることです。しかし、私が言ったように、これはすべて、より高い空間の複雑さを犠牲にしている。ワイルドカードの位置に基づいたワイルドカードクエリは、時間の複雑さが増し、適切な場所に「*」を挿入する必要があります。 – Yavar

+0

現在、すべてのインデックスが作成され、クロールとインデックス作成に時間がかかっていたため、インデックス作成メカニズムを変更するために多くの変更が必要でした。しかし、ワイルドカードの場合、私は777の結果を得るのではなく、777BondまたはBondの結果を得る。 –

0

ワイルドカード検索を使用できます。

"?" 1文字のワイルドカード検索のシンボル、複数文字のワイルドカード検索の場合は「*」記号(0文字以上)

例 - "UPLO *"(フレーズ検索内ではない)のLuceneは、単一用語内の単一および複数文字のワイルドカード検索をサポートしてい

Query query = queryParser.parse(text); 

Query query = queryParser.parse("*"+text+"*"); 

+0

これはUploだけを試みたときに機能しましたが、数字ベースの検索が停止しました.50aを与えたときのように、結果は得られません。 –

+0

@WeareBorg - これは、分析のために番号を索引付けしていないためです。ワイルドカードによるクエリは分析されません。 SimpleAnalyzerを使用していますが、文字以外のすべてを削除します。 StandardAnalyzerはうまくいくでしょう。 – femtoRgon

+0

StandardAnalyzerでも同様です。私は(私が今やっている)数字を含むテキストを保存して検索したい。ありがとうございました。 –

0

変更。

1文字のワイルドカード検索を実行するには、 "?"シンボル。

複数文字のワイルドカード検索を実行するには、「*」記号を使用します。

1文字のワイルドカード検索では、1文字が置き換えられた単語と一致する単語が検索されます。

te?t 

複数文字のワイルドカード検索は0文字以上の文字を探します。たとえば、あなたが検索を使用することができ、「テキスト」または「テスト」を検索します。例えば、テスト、テストやテスターを検索するために、検索を使用することができます。

test* 

また、期間の途中でワイルドカード検索を使用することができます。

te*t 

注:*または?は使用できません。シンボルを検索の最初の文字として使用します。

+0

私は星を追加すると、50Aなどのような数字ベースの検索を取得しません。何か案は? –

関連する問題