내 사용자 검색에 Lucene을 사용하고 있습니다. 인덱스를 들어 다음 코드를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
나는 검색 상자를 가지고 ... 그래서 난 사용자가 검색 시작해야합니다 예를 들어 입력 시작하는 순간을합니다. 내 로그인 정보에는 전자 메일 아이디가 들어 있습니다. 예를 들어 firstName은 피터, lastName은 foo입니다. –
내가 말했듯이, 당신은'PrefixQuery'를 사용해야합니다, 그리고 분석은 여기에서도 필요할 것 같습니다. – femtoRgon
코드를 Prefix Query로 변경했지만 결과가 여전히 없습니다. –