Java源码示例:org.apache.lucene.queryParser.MultiFieldQueryParser
示例1
private org.apache.lucene.search.Query createFullTextQuery(final String[] searchFields, final QueryFilter queryFilter,
final String searchString)
{
final MultiFieldQueryParser parser = new MultiFieldQueryParser(LUCENE_VERSION, searchFields, new ClassicAnalyzer(Version.LUCENE_31));
parser.setAllowLeadingWildcard(true);
org.apache.lucene.search.Query query = null;
try {
query = parser.parse(searchString);
} catch (final org.apache.lucene.queryParser.ParseException ex) {
final String errorMsg = "Lucene error message: "
+ ex.getMessage()
+ " (for "
+ this.getClass().getSimpleName()
+ ": "
+ searchString
+ ").";
if (queryFilter != null) {
queryFilter.setErrorMessage(errorMsg);
}
log.info(errorMsg);
return null;
}
return query;
}
示例2
public IndexSearcher() {
try {
searcher = new org.apache.lucene.search.IndexSearcher(new ClasspathDirectory());
} catch (IOException e) {
e.printStackTrace();
}
analyzer = new StandardAnalyzer(Version.LUCENE_31);
parser = new MultiFieldQueryParser(Version.LUCENE_31, new String[]{"name","description"}, analyzer);
}
示例3
public IndexSearcher() {
try {
searcher = new org.apache.lucene.search.IndexSearcher(new ClasspathDirectory());
} catch (IOException e) {
e.printStackTrace();
}
analyzer = new StandardAnalyzer(Version.LUCENE_31);
parser = new MultiFieldQueryParser(Version.LUCENE_31, new String[]{"name","description"}, analyzer);
}
示例4
public List<Course> getCourses(String query) {
try {
List<Course> qlist = new ArrayList<Course>();
IndexSearcher indexSearcher = new IndexSearcher(INDEXPATH);
long begin = new Date().getTime();
//下面的是进行title,content 两个范围内进行收索. SHOULD 表示OR
BooleanClause.Occur[] clauses = {BooleanClause.Occur.SHOULD, BooleanClause.Occur.SHOULD};
Query queryOBJ = MultiFieldQueryParser.parse(query, new String[]{"courseIntro", "courseTitle"}, clauses, new StandardAnalyzer());//parser.parse(query);
Filter filter = null;
//################# 搜索相似度最高的记录 ###################
TopDocs topDocs = indexSearcher.search(queryOBJ, filter, 1000);
Course course = null;
//输出结果
for (ScoreDoc scoreDoc : topDocs.scoreDocs) {
Document targetDoc = indexSearcher.doc(scoreDoc.doc);
course = new Course();
String courseIntro = targetDoc.get("courseIntro");
String courseTitle = targetDoc.get("courseTitle");
String courseId = targetDoc.get("courseId");
TokenStream contentTokenStream = analyzer.tokenStream("courseIntro", new StringReader(courseIntro));
TokenStream titleTokenStream = analyzer.tokenStream("courseTitle", new StringReader(courseTitle));
course.setCourseIntro(courseIntro);
course.setCourseTitle(courseTitle);
course.setCourseId(courseId);
course.setType(targetDoc.get("type"));
course.setCourseState(targetDoc.get("courseState"));
qlist.add(course);
}
indexSearcher.close();
return qlist;
} catch (Exception e) {
logger.error("getCourses error.");
return null;
}
}
示例5
public SearchResult search(SearchCriteria criteria, List<MusicFolder> musicFolders, IndexType indexType) {
SearchResult result = new SearchResult();
int offset = criteria.getOffset();
int count = criteria.getCount();
result.setOffset(offset);
IndexReader reader = null;
try {
reader = createIndexReader(indexType);
Searcher searcher = new IndexSearcher(reader);
Analyzer analyzer = new SubsonicAnalyzer();
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(LUCENE_VERSION, indexType.getFields(), analyzer, indexType.getBoosts());
BooleanQuery query = new BooleanQuery();
query.add(queryParser.parse(analyzeQuery(criteria.getQuery())), BooleanClause.Occur.MUST);
List<SpanTermQuery> musicFolderQueries = new ArrayList<SpanTermQuery>();
for (MusicFolder musicFolder : musicFolders) {
if (indexType == ALBUM_ID3 || indexType == ARTIST_ID3) {
musicFolderQueries.add(new SpanTermQuery(new Term(FIELD_FOLDER_ID, NumericUtils.intToPrefixCoded(musicFolder.getId()))));
} else {
musicFolderQueries.add(new SpanTermQuery(new Term(FIELD_FOLDER, musicFolder.getPath().getPath())));
}
}
query.add(new SpanOrQuery(musicFolderQueries.toArray(new SpanQuery[musicFolderQueries.size()])), BooleanClause.Occur.MUST);
TopDocs topDocs = searcher.search(query, null, offset + count);
result.setTotalHits(topDocs.totalHits);
int start = Math.min(offset, topDocs.totalHits);
int end = Math.min(start + count, topDocs.totalHits);
for (int i = start; i < end; i++) {
Document doc = searcher.doc(topDocs.scoreDocs[i].doc);
switch (indexType) {
case SONG:
case ARTIST:
case ALBUM:
MediaFile mediaFile = mediaFileService.getMediaFile(Integer.valueOf(doc.get(FIELD_ID)));
addIfNotNull(mediaFile, result.getMediaFiles());
break;
case ARTIST_ID3:
Artist artist = artistDao.getArtist(Integer.valueOf(doc.get(FIELD_ID)));
addIfNotNull(artist, result.getArtists());
break;
case ALBUM_ID3:
Album album = albumDao.getAlbum(Integer.valueOf(doc.get(FIELD_ID)));
addIfNotNull(album, result.getAlbums());
break;
default:
break;
}
}
} catch (Throwable x) {
LOG.error("Failed to execute Lucene search.", x);
} finally {
FileUtil.closeQuietly(reader);
}
return result;
}
示例6
/**
* Do search a certain query. The results will be filtered for the identity and roles.
*
* @param queryString
* Search query-string.
* @param identity
* Filter results for this identity (user).
* @param roles
* Filter results for this roles (role of user).
* @return SearchResults object for this query
*/
@Override
public SearchResults doSearch(final String queryString, final List<String> condQueries, final Identity identity, final Roles roles, final int firstResult,
final int maxResults, final boolean doHighlighting) throws ServiceNotAvailableException, ParseException {
try {
if (!existIndex()) {
log.warn("Index does not exist, can't search for queryString: " + queryString);
throw new ServiceNotAvailableException("Index does not exist");
}
synchronized (createIndexSearcherLock) {// o_clusterOK by:fj if service is only configured on one vm, which is recommended way
if (searcher == null) {
try {
createIndexSearcher(indexPath);
checkIsIndexUpToDate();
} catch (final IOException ioEx) {
log.warn("Can not create searcher", ioEx);
throw new ServiceNotAvailableException("Index is not available");
}
}
if (hasNewerIndexFile()) {
reopenIndexSearcher();
checkIsIndexUpToDate();
}
}
log.info("queryString=" + queryString);
final BooleanQuery query = new BooleanQuery();
if (StringHelper.containsNonWhitespace(queryString)) {
final QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_CURRENT, fields, analyzer);
queryParser.setLowercaseExpandedTerms(false);// some add. fields are not tokenized and not lowered case
final Query multiFieldQuery = queryParser.parse(queryString.toLowerCase());
query.add(multiFieldQuery, Occur.MUST);
}
if (condQueries != null && !condQueries.isEmpty()) {
for (final String condQueryString : condQueries) {
final QueryParser condQueryParser = new QueryParser(Version.LUCENE_CURRENT, condQueryString, analyzer);
condQueryParser.setLowercaseExpandedTerms(false);
final Query condQuery = condQueryParser.parse(condQueryString);
query.add(condQuery, Occur.MUST);
}
}
if (log.isDebugEnabled()) {
log.debug("query=" + query);
}
// TODO: 14.06.2010/cg : fellowig cide fragment can be removed later, do no longer call rewrite(query) because wildcard-search problem (OLAT-5359)
// Query query = null;
// try {
// query = searcher.rewrite(query);
// log.debug("after 'searcher.rewrite(query)' query=" + query);
// } catch (Exception ex) {
// throw new QueryException("Rewrite-Exception query because too many clauses. Query=" + query);
// }
final long startTime = System.currentTimeMillis();
final int n = SearchServiceFactory.getService().getSearchModuleConfig().getMaxHits();
final TopDocs docs = searcher.search(query, n);
final long queryTime = System.currentTimeMillis() - startTime;
if (log.isDebugEnabled()) {
log.debug("hits.length()=" + docs.totalHits);
}
final SearchResultsImpl searchResult = new SearchResultsImpl(mainIndexer, searcher, docs, query, analyzer, identity, roles, firstResult, maxResults,
doHighlighting);
searchResult.setQueryTime(queryTime);
searchResult.setNumberOfIndexDocuments(searcher.maxDoc());
queryCount++;
return searchResult;
} catch (final ServiceNotAvailableException naex) {
// pass exception
throw new ServiceNotAvailableException(naex.getMessage());
} catch (final ParseException pex) {
throw new ParseException("can not parse query=" + queryString);
} catch (final Exception ex) {
log.warn("Exception in search", ex);
throw new ServiceNotAvailableException(ex.getMessage());
}
}
示例7
/**
* @see org.olat.lms.search.SearchService#doSearch(String, List, Identity, Roles, int, int, boolean)
*/
public SearchResults doSearch(final String queryString, final List<String> condQueries, final Identity identity, final Roles roles, final int firstResult,
final int maxResults, final boolean doHighlighting) throws ServiceNotAvailableException, QueryException {
synchronized (createIndexSearcherLock) {// o_clusterOK by:fj if service is only configured on one vm, which is recommended way
if (searcher == null) {
log.warn("Index does not exist, can't search for queryString: " + queryString);
throw new ServiceNotAvailableException("Index does not exist");
}
}
try {
log.info("queryString=" + queryString);
final BooleanQuery query = new BooleanQuery();
if (StringHelper.containsNonWhitespace(queryString)) {
final QueryParser queryParser = new MultiFieldQueryParser(Version.LUCENE_30, fields, analyzer);
queryParser.setLowercaseExpandedTerms(false);// some add. fields are not tokenized and not lowered case
final Query multiFieldQuery = queryParser.parse(queryString.toLowerCase());
query.add(multiFieldQuery, Occur.MUST);
}
if (condQueries != null && !condQueries.isEmpty()) {
for (final String condQueryString : condQueries) {
final QueryParser condQueryParser = new QueryParser(Version.LUCENE_30, condQueryString, analyzer);
condQueryParser.setLowercaseExpandedTerms(false);
final Query condQuery = condQueryParser.parse(condQueryString);
query.add(condQuery, Occur.MUST);
}
}
if (log.isDebugEnabled()) {
log.debug("query=" + query);
}
// TODO: 14.06.2010/cg : fellowig cide fragment can be removed later, do no longer call rewrite(query) because wildcard-search problem (OLAT-5359)
// Query query = null;
// try {
// query = searcher.rewrite(query);
// log.debug("after 'searcher.rewrite(query)' query=" + query);
// } catch (Exception ex) {
// throw new QueryException("Rewrite-Exception query because too many clauses. Query=" + query);
// }
final long startTime = System.currentTimeMillis();
final int n = SearchServiceFactory.getService().getSearchModuleConfig().getMaxHits();
final TopDocs docs = searcher.search(query, n);
final long queryTime = System.currentTimeMillis() - startTime;
if (log.isDebugEnabled()) {
log.debug("hits.length()=" + docs.totalHits);
}
final SearchResultsImpl searchResult = new SearchResultsImpl(mainIndexer, searcher, docs, query, analyzer, identity, roles, firstResult, maxResults,
doHighlighting);
searchResult.setQueryTime(queryTime);
searchResult.setNumberOfIndexDocuments(searcher.maxDoc());
queryCount++;
return searchResult;
} catch (final ParseException pex) {
throw new QueryException("can not parse query=" + queryString);
} catch (final Exception ex) {
log.warn("Exception in search", ex);
throw new ServiceNotAvailableException(ex.getMessage());
}
}
示例8
public static void main(String[] args) throws Exception{
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
SessionFactory sessionFactory = applicationContext.getBean("hibernate4sessionFactory",SessionFactory.class);
FullTextSession fullTextSession = Search.getFullTextSession(sessionFactory.openSession());
//使用Hibernate Search api查询 从多个字段匹配 name、description、authors.name
// QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Book.class ).get();
// Query luceneQuery = qb.keyword().onFields("name","description","authors.name").matching("移动互联网").createQuery();
//使用lucene api查询 从多个字段匹配 name、description、authors.name
//使用庖丁分词器
MultiFieldQueryParser queryParser=new MultiFieldQueryParser(Version.LUCENE_36, new String[]{"name","description","authors.name"}, new PaodingAnalyzer());
Query luceneQuery=queryParser.parse("实战");
FullTextQuery fullTextQuery =fullTextSession.createFullTextQuery(luceneQuery, Book.class);
//设置每页显示多少条
fullTextQuery.setMaxResults(5);
//设置当前页
fullTextQuery.setFirstResult(0);
//高亮设置
SimpleHTMLFormatter formatter=new SimpleHTMLFormatter("<b><font color='red'>", "<font/></b>");
QueryScorer queryScorer=new QueryScorer(luceneQuery);
Highlighter highlighter=new Highlighter(formatter, queryScorer);
@SuppressWarnings("unchecked")
List<Book> resultList = fullTextQuery.list();
System.out.println("共查找到["+resultList.size()+"]条记录");
for (Book book : resultList) {
String highlighterString=null;
Analyzer analyzer=new PaodingAnalyzer();
try {
//高亮name
highlighterString=highlighter.getBestFragment(analyzer, "name", book.getName());
if(highlighterString!=null){
book.setName(highlighterString);
}
//高亮authors.name
Set<Author> authors = book.getAuthors();
for (Author author : authors) {
highlighterString=highlighter.getBestFragment(analyzer, "authors.name", author.getName());
if(highlighterString!=null){
author.setName(highlighterString);
}
}
//高亮description
highlighterString=highlighter.getBestFragment(analyzer, "description", book.getDescription());
if(highlighterString!=null){
book.setDescription(highlighterString);
}
} catch (Exception e) {
}
System.out.println("书名:"+book.getName()+"\n描述:"+book.getDescription()+"\n出版日期:"+book.getPublicationDate());
System.out.println("----------------------------------------------------------");
}
fullTextSession.close();
sessionFactory.close();
}
示例9
@Override
public QueryResult<Book> query(String keyword, int start, int pagesize,Analyzer analyzer,String...field) throws Exception{
QueryResult<Book> queryResult=new QueryResult<Book>();
List<Book> books=new ArrayList<Book>();
FullTextSession fullTextSession = Search.getFullTextSession(getSession());
//使用Hibernate Search api查询 从多个字段匹配 name、description、authors.name
//QueryBuilder qb = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Book.class ).get();
//Query luceneQuery = qb.keyword().onFields(field).matching(keyword).createQuery();
//使用lucene api查询 从多个字段匹配 name、description、authors.name
MultiFieldQueryParser queryParser=new MultiFieldQueryParser(Version.LUCENE_36,new String[]{"name","description","authors.name"}, analyzer);
Query luceneQuery=queryParser.parse(keyword);
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(luceneQuery);
int searchresultsize = fullTextQuery.getResultSize();
queryResult.setSearchresultsize(searchresultsize);
System.out.println("共查找到["+searchresultsize+"]条记录");
fullTextQuery.setFirstResult(start);
fullTextQuery.setMaxResults(pagesize);
//设置按id排序
fullTextQuery.setSort(new Sort(new SortField("id", SortField.INT ,true)));
//高亮设置
SimpleHTMLFormatter formatter=new SimpleHTMLFormatter("<b><font color='red'>", "</font></b>");
QueryScorer queryScorer=new QueryScorer(luceneQuery);
Highlighter highlighter=new Highlighter(formatter, queryScorer);
@SuppressWarnings("unchecked")
List<Book> tempresult = fullTextQuery.list();
for (Book book : tempresult) {
String highlighterString=null;
try {
//高亮name
highlighterString=highlighter.getBestFragment(analyzer, "name", book.getName());
if(highlighterString!=null){
book.setName(highlighterString);
}
//高亮authors.name
Set<Author> authors = book.getAuthors();
for (Author author : authors) {
highlighterString=highlighter.getBestFragment(analyzer, "authors.name", author.getName());
if(highlighterString!=null){
author.setName(highlighterString);
}
}
//高亮description
highlighterString=highlighter.getBestFragment(analyzer, "description", book.getDescription());
if(highlighterString!=null){
book.setDescription(highlighterString);
}
} catch (Exception e) {
}
books.add(book);
System.out.println("书名:"+book.getName()+"\n描述:"+book.getDescription()+"\n出版日期:"+book.getPublicationDate());
System.out.println("----------------------------------------------------------");
}
queryResult.setSearchresult(books);
return queryResult;
}
示例10
public static void main(String[] args) throws Exception{
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
EntityManagerFactory entityManagerFactory = applicationContext.getBean("entityManagerFactory",EntityManagerFactory.class);
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManagerFactory.createEntityManager());
//使用Hibernate Search api查询 从多个字段匹配 name、description、authors.name
// QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Book.class ).get();
// Query luceneQuery = qb.keyword().onFields("name","description","authors.name").matching("移动互联网").createQuery();
//使用lucene api查询 从多个字段匹配 name、description、authors.name
//使用庖丁分词器
MultiFieldQueryParser queryParser=new MultiFieldQueryParser(Version.LUCENE_36, new String[]{"name","description","authors.name"}, new PaodingAnalyzer());
Query luceneQuery=queryParser.parse("实战");
FullTextQuery fullTextQuery =fullTextEntityManager.createFullTextQuery(luceneQuery, Book.class);
//设置每页显示多少条
fullTextQuery.setMaxResults(5);
//设置当前页
fullTextQuery.setFirstResult(0);
//高亮设置
SimpleHTMLFormatter formatter=new SimpleHTMLFormatter("<b><font color='red'>", "<font/></b>");
QueryScorer queryScorer=new QueryScorer(luceneQuery);
Highlighter highlighter=new Highlighter(formatter, queryScorer);
@SuppressWarnings("unchecked")
List<Book> resultList = fullTextQuery.getResultList();
for (Book book : resultList) {
String highlighterString=null;
Analyzer analyzer=new PaodingAnalyzer();
try {
//高亮name
highlighterString=highlighter.getBestFragment(analyzer, "name", book.getName());
if(highlighterString!=null){
book.setName(highlighterString);
}
//高亮authors.name
Set<Author> authors = book.getAuthors();
for (Author author : authors) {
highlighterString=highlighter.getBestFragment(analyzer, "authors.name", author.getName());
if(highlighterString!=null){
author.setName(highlighterString);
}
}
//高亮description
highlighterString=highlighter.getBestFragment(analyzer, "description", book.getDescription());
if(highlighterString!=null){
book.setDescription(highlighterString);
}
} catch (Exception e) {
}
}
fullTextEntityManager.close();
entityManagerFactory.close();
}
示例11
@Override
public QueryResult<Book> query(String keyword, int start, int pagesize,Analyzer analyzer,String...field) throws Exception{
QueryResult<Book> queryResult=new QueryResult<Book>();
List<Book> books=new ArrayList<Book>();
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
//使用Hibernate Search api查询 从多个字段匹配 name、description、authors.name
//QueryBuilder qb = fullTextSession.getSearchFactory().buildQueryBuilder().forEntity(Book.class ).get();
//Query luceneQuery = qb.keyword().onFields(field).matching(keyword).createQuery();
//使用lucene api查询 从多个字段匹配 name、description、authors.name
MultiFieldQueryParser queryParser=new MultiFieldQueryParser(Version.LUCENE_36,new String[]{"name","description","authors.name"}, analyzer);
Query luceneQuery=queryParser.parse(keyword);
FullTextQuery fullTextQuery = fullTextEntityManager.createFullTextQuery(luceneQuery);
int searchresultsize = fullTextQuery.getResultSize();
queryResult.setSearchresultsize(searchresultsize);
fullTextQuery.setFirstResult(start);
fullTextQuery.setMaxResults(pagesize);
//设置按id排序
fullTextQuery.setSort(new Sort(new SortField("id", SortField.INT ,true)));
//高亮设置
SimpleHTMLFormatter formatter=new SimpleHTMLFormatter("<b><font color='red'>", "</font></b>");
QueryScorer queryScorer=new QueryScorer(luceneQuery);
Highlighter highlighter=new Highlighter(formatter, queryScorer);
@SuppressWarnings("unchecked")
List<Book> tempresult = fullTextQuery.getResultList();
for (Book book : tempresult) {
String highlighterString=null;
try {
//高亮name
highlighterString=highlighter.getBestFragment(analyzer, "name", book.getName());
if(highlighterString!=null){
book.setName(highlighterString);
}
//高亮authors.name
Set<Author> authors = book.getAuthors();
for (Author author : authors) {
highlighterString=highlighter.getBestFragment(analyzer, "authors.name", author.getName());
if(highlighterString!=null){
author.setName(highlighterString);
}
}
//高亮description
highlighterString=highlighter.getBestFragment(analyzer, "description", book.getDescription());
if(highlighterString!=null){
book.setDescription(highlighterString);
}
} catch (Exception e) {
}
books.add(book);
}
queryResult.setSearchresult(books);
return queryResult;
}