您的位置:首页 > 其它

Lucene的多种高级搜索形式

2014-05-31 19:43 399 查看
布尔操作符

大多数的搜索引擎都会提供布尔操作符让用户可以组合查询,典型的布尔操作符有 AND,OR,NOT。Lucene 支持 5种布尔操作符,分别是 AND,OR,NOT,加(+),减(-)。接下来我会讲述每个操作符的用法。

OR: 如果你要搜索含有字符 A 或者 B 的文档,那么就需要使用 OR操作符。需要记住的是,如果你只是简单的用空格将两个关键词分割开,其实在搜索的时候搜索引擎会自动在两个关键词之间加上 OR操作符。例如,“Java OR Lucene” 和 “Java Lucene” 都是搜索含有 Java 或者含有 Lucene的文档。

AND: 如果你需要搜索包含一个以上关键词的文档,那么就需要使用 AND 操作符。例如,“Java AND Lucene”返回所有既包含 Java 又包含 Lucene 的文档。

NOT: Not 操作符使得包含紧跟在 NOT 后面的关键词的文档不会被返回。例如,如果你想搜索所有含有 Java 但不含有Lucene 的文档,你可以使用查询语句 “Java NOT Lucene”。但是你不能只对一个搜索词使用这个操作符,比如,查询语句“NOT Java” 不会返回任何结果。

加号(+): 这个操作符的作用和 AND 差不多,但它只对紧跟着它的一个搜索词起作用。例如,如果你想搜索一定包含Java,但不一定包含 Lucene 的文档,就可以使用查询语句“+Java Lucene”。

减号(-): 这个操作符的功能和 NOT 一样,查询语句 “Java -Lucene” 返回所有包含 Java 但不包含Lucene 的文档。

接下来我们看一下如何利用 Lucene 提供的 API 来实现布尔查询。清单1 显示了如果利用布尔操作符进行查询的过程。

清单1:使用布尔操作符

01
//Test
boolean operator
02
03
public
void
testOperator(String
indexDirectory) throwsException{
04
05
Directory
dir =FSDirectory.getDirectory(indexDirectory,
false
);
06
07
IndexSearcher
indexSearcher =
new
IndexSearcher(dir);
08
09
String[]
searchWords = {
"Java
AND Lucene"
,
"Java
NOT Lucene"
,
"JavaOR
Lucene"
,
10
11
"+Java
+Lucene"
,
"+Java
-Lucene"
};
12
13
Analyzer
language =
new
StandardAnalyzer();
14
15
Query
query;
16
17
for
(
int
i
=
0
;
i < searchWords.length; i++){
18
19
query
=QueryParser.parse(searchWords[i],
"title"
,
language);
20
21
Hits
results = indexSearcher.search(query);
22
23
System.out.println(results.length()
+
"search
results for query "
+searchWords[i]);}<p></p>
24
<p></p>
域搜索(Field Search)

Lucene 支持域搜索,你可以指定一次查询是在哪些域(Field)上进行。例如,如果索引的文档包含两个域,Title 和Content,你就可以使用查询 “Title: Lucene AND Content: Java” 来返回所有在 Title域上包含 Lucene 并且在 Content 域上包含 Java 的文档。清单 2 显示了如何利用 Lucene 的 API来实现域搜索。

清单2:实现域搜索

01
<p>
//Test
field search
02
03
public
void
testFieldSearch(String
indexDirectory) throwsException{
04
05
Directory
dir =FSDirectory.getDirectory(indexDirectory,
false
);
06
07
IndexSearcher
indexSearcher =
new
IndexSearcher(dir);
08
09
String
searchWords =
"title:Lucene
AND content:Java"
;
10
11
Analyzer
language =
new
StandardAnalyzer();
12
13
Query
query =QueryParser.parse(searchWords,
"title"
,language);
14
15
Hits
results = indexSearcher.search(query);
16
17
System.out.println(results.length()
+
"search
results for query "
+searchWords);</p>
18
<p></p>
通配符搜索(Wildcard Search)

Lucene支持两种通配符:问号(?)和星号(*)。你可以使用问号(?)来进行单字符的通配符查询,或者利用星号(*)进行多字符的通配符查询。例如,如果你想搜索tiny 或者 tony,你就可以使用查询语句 “t?ny”;如果你想查询 Teach,Teacher 和Teaching,你就可以使用查询语句 “Teach*”。清单3 显示了通配符查询的过程。

清单3:进行通配符查询

01
<p>
//Test
wildcard search
02
03
public
void
testWildcardSearch(String
indexDirectory)throwsException{
04
05
Directory
dir =FSDirectory.getDirectory(indexDirectory,
false
);
06
07
IndexSearcher
indexSearcher =
new
IndexSearcher(dir);
08
09
String[]
searchWords = {
"tex*"
,
"tex?"
,
"?ex*"
};
10
11
Query
query;
12
13
for
(
int
i
=
0
;
i < searchWords.length; i++){
14
15
query
=
new
WildcardQuery(
new
Term(
"title"
,searchWords[i]));
16
17
Hits
results = indexSearcher.search(query);
18
19
System.out.println(results.length()
+
"search
results for query "
+searchWords[i]);}</p>
20
<p></p>
模糊查询

Lucene 提供的模糊查询基于编辑距离算法(Edit distance algorithm)。你可以在搜索词的尾部加上字符 ~来进行模糊查询。例如,查询语句 “think~” 返回所有包含和 think 类似的关键词的文档。清单 4 显示了如果利用Lucene 的 API 进行模糊查询的代码。

清单4:实现模糊查询

01
<p>
//Test
fuzzy search
02
03
public
void
testFuzzySearch(String
indexDirectory)throwsException{
04
05
Directory
dir =FSDirectory.getDirectory(indexDirectory,
false
);
06
07
IndexSearcher
indexSearcher =
new
IndexSearcher(dir);
08
09
String[]
searchWords = {
"text"
,
"funny"
};
10
11
Query
query;
12
13
for
(
int
i
=
0
;
i < searchWords.length; i++){
14
15
query
=
new
FuzzyQuery(
new
Term(
"title"
,searchWords[i]));
16
17
Hits
results = indexSearcher.search(query);
18
19
System.out.println(results.length()
+
"search
results for query "
+searchWords[i]);}</p>
20
<p></p>
范围搜索(Range Search)

范围搜索匹配某个域上的值在一定范围的文档。例如,查询 “age:[18 TO 35]” 返回所有 age 域上的值在 18 到35 之间的文档。清单5显示了利用 Lucene 的 API 进行返回搜索的过程。

清单5:测试范围搜索

01
<p>
//Test
range search
02
03
public
void
testRangeSearch(String
indexDirectory)throwsException{
04
05
Directory
dir =FSDirectory.getDirectory(indexDirectory,
false
);
06
07
IndexSearcher
indexSearcher =
new
IndexSearcher(dir);
08
09
Term
begin =
new
Term(
"birthDay"
,
"20000101"
);
10
11
Term
end = newTerm(
"birthDay"
,
"20060606"
);
12
13
Query
query =
new
RangeQuery(begin,end,
true
);
14
15
Hits
results = indexSearcher.search(query);
16
17
System.out.println(results.length()
+
"search
results isreturned"
);
18
19
}</p>
标签: <无>


代码片段(1)[全屏查看所有代码]

1. [代码]清单1:使用布尔操作符

01
//Test
boolean operator
02
public
void
testOperator(String
indexDirectory) throwsException{
03
Directory
dir =FSDirectory.getDirectory(indexDirectory,
false
);
04
IndexSearcher
indexSearcher =
new
IndexSearcher(dir);
05
String[]
searchWords = {
"Java
AND Lucene"
,
"Java
NOT Lucene"
,
"JavaOR
Lucene"
,
06
"+Java
+Lucene"
,
"+Java
-Lucene"
};
07
Analyzer
language =
new
StandardAnalyzer();
08
Query
query;
09
for
(
int
i
=
0
;
i < searchWords.length; i++){
10
query
=QueryParser.parse(searchWords[i],
"title"
,
language);
11
Hits
results = indexSearcher.search(query);
12
System.out.println(results.length()
+
"search
results for query "
+searchWords[i]);}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Lucene 高级搜索