2012-08-14

[Lucene.Net] 搜尋多個欄位

如果你跟我一樣剛開始玩Lucene.Net的話,搜尋的部分應該差不多都是用下面這樣的範例

QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "ArticleTitle", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29));
Query query = parser.Parse(_searchString);

這樣的範例是針對一個欄位搜尋,

那如果要針對多個欄位呢?

要針對多的欄位搜尋的話,有三個方式,

第一個是用BooleanQuery

Query _queryTitle = new TermQuery(new Term("ArticleTitle", _searchString));
Query _queryId = new TermQuery(new Term("ArticleId", _searchString));
BooleanQuery _query = new BooleanQuery();
_query.Add(_queryTitle, BooleanClause.Occur.SHOULD);
_query.Add(_queryId, BooleanClause.Occur.SHOULD);
TopDocs _topDocs = indexSearcher.Search(_query,10);

如果想要用and的效果,則是將 BooleanClause.Occur.SHOULD 改成BooleanClause.Occur.MUST

 

第二個用MultifieldQueryFieldParser

MultiFieldQueryParser _mQueryParser = new MultiFieldQueryParser(Lucene.Net.Util.Version.LUCENE_29 ,new string[] { "ArticleTitle", "ArticleId" }, new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29));
TopDocs _topDocs = this._searcher.Search(_mQueryParser.Parse(_searchString), 10);

第三個則是一樣用QueryParser,只是設定搜尋字串的時候,要使用特定的語法.(其實就只是把欄位跟查詢條件寫在一起而已...)

QueryParser parser = new QueryParser(Lucene.Net.Util.Version.LUCENE_29, "ArticleTitle", new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_29));
string _queryString = "ArticleTitle:" + _searchString + " OR ArticleId:" + _searchString;
Query query = parser.Parse(_queryString);
TopDocs _topDocs = this._searcher.Search(query, 10);

如果_queryString沒有設定特定的欄位的話,就會搜尋ArticleTitle

 

參考網頁

BooleanClause.Occur

Lucene QueryParser two Fields

Query Parser Syntax

張貼留言

Ubunutu 上安裝python2, 3, pip 跟virtualenv

# 安裝 python2, python3 (ubuntu 17.04已經預設安裝python3, 但沒有python2) sudo apt install python python-dev python3 python3-dev # 安裝 pip curl https://b...