0

ユーザー検索に Lucene を使用しています。インデックス作成のために、私は次のコードを持っています

private void internalAddUser(User user) throws IOException {
    Document document = new Document();
    document.add(new Field("login", user.getLogin(), Field.Store.YES, Field.Index.NOT_ANALYZED));
    document.add(new Field("firstName", user.getFirstName(), Field.Store.YES, Field.Index.NOT_ANALYZED));
    document.add(new Field("lastName", user.getLastName(), Field.Store.YES, Field.Index.NOT_ANALYZED));
    userIndexWriter.addDocument(document);
}

検索には次のコードを使用しますが、結果が得られません。

@Override
@Cacheable("user-prefix-cache")
public Collection<String> searchUserByPrefix(String prefix) {
    IndexSearcher searcher = null;
    List<String> logins = new ArrayList<String>();
    try {
        searcher = userSearcherManager.acquire();

        BooleanQuery booleanQuery = new BooleanQuery();

        Query query1 = new TermQuery(new Term("login", prefix));
        Query query2 = new TermQuery(new Term("firstName", prefix));
        Query query3 = new TermQuery(new Term("lastName", prefix));

        booleanQuery.add(query1, BooleanClause.Occur.SHOULD);
        booleanQuery.add(query2, BooleanClause.Occur.SHOULD);
        booleanQuery.add(query3, BooleanClause.Occur.SHOULD);

        SortField sortField = new SortField("login", SortField.STRING, true);
        Sort sort = new Sort(sortField);

        TopDocs topDocs = searcher.search(booleanQuery, DEFAULT_TOP_N_SEARCH_USER, sort);
        int totalHits = topDocs.totalHits;
        if (totalHits == 0) {
            return new ArrayList<String>();
        }

        ScoreDoc[] scoreDocArray = topDocs.scoreDocs;
        for (int i = 0; i < scoreDocArray.length; i++) {
            int documentId = scoreDocArray[i].doc;
            Document document = searcher.doc(documentId);
            logins.add(document.get("login"));
        }
    } catch (IOException e) {
        log.error("A Lucene query had a I/O error : " + e.getMessage());
        if (log.isDebugEnabled()) {
            e.printStackTrace();
        }
    } finally {
        try {
            userSearcherManager.release(searcher);
        } catch (IOException e) {
            log.error("The Lucene searcher could not be given back to the searcherManager pool. " +
                    e.getMessage());

            if (log.isDebugEnabled()) {
                e.printStackTrace();
            }
        }
    }
    return logins;
}

私はルセンを期待していませんが、なぜ機能しないのかわかりません。誰にもアイデアはありますか。

[DEBUG] in.daydiary.web.rest.SearchController - REST request to find users starting with : j
[DEBUG] in.daydiary.web.rest.SearchController - REST request to find users starting with : j
[DEBUG] in.daydiary.web.rest.SearchController - REST request to find users starting with : ju
[DEBUG] in.daydiary.web.rest.SearchController - REST request to find users starting with : jul
[DEBUG] in.daydiary.web.rest.SearchController - REST request to find users starting with : juli
[DEBUG] in.daydiary.web.rest.SearchController - REST request to find users starting with : julia
[DEBUG] in.daydiary.web.rest.SearchController - REST request to find users starting with : julianb
[DEBUG] in.daydiary.web.rest.SearchController - REST request to find users starting with : julianb
[DEBUG] in.daydiary.web.rest.SearchController - REST request to find users starting with : julian
[DEBUG] in.daydiary.web.rest.SearchController - REST request to find users starting with : julia
[DEBUG] in.daydiary.web.rest.SearchController - REST request to find users starting with : juli
[DEBUG] in.daydiary.web.rest.SearchController - REST request to find users starting with : jul
[DEBUG] in.daydiary.web.rest.SearchController - REST request to find users starting with : ju
[DEBUG] in.daydiary.web.rest.SearchController - REST request to find users starting with : j
4

2 に答える 2

0

初め。lucene バージョンを提供するように注意してください。

2番。確かにインデックスが見えます。Lucene と同じバージョンの luke を入手してください。luke 内のインデックス付きデータが表示されます。java -jar jarname を実行するだけで実行できます。

三番。インデックス作成プロセス中に使用されるアナライザーと、検索プロセス中に使用されるアナライザーが同じかどうかを確認してください。これは、誰もが犯す非常に一般的な間違いです。

第4。ヒットしていないので、HITS が見つからない原因となる可能性のあるいくつかのポイントについて言及しているこの優れたリンクを参照してください。

http://wiki.apache.org/lucene-java/LuceneFAQ#Why_am_I_getting_no_hits_.2F_incorrect_hits.3F

于 2013-09-12T12:54:39.920 に答える