当前位置: 移动技术网 > IT编程>开发语言>Java > Lucene实现多种高级搜索形式

Lucene实现多种高级搜索形式

2019年07月22日  | 移动技术网IT编程  | 我要评论

布尔操作符

大多数的搜索引擎都会提供布尔操作符让用户可以组合查询,典型的布尔操作符有 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:使用布尔操作符

//test boolean operator
public void testoperator(string indexdirectory) throwsexception{
directory dir =fsdirectory.getdirectory(indexdirectory,false);
indexsearcher indexsearcher = new indexsearcher(dir);
string[] searchwords = {"java and lucene", "java not lucene", "javaor lucene",
"+java +lucene", "+java -lucene"};
analyzer language = new standardanalyzer();
query query;
for(int i = 0; i < searchwords.length; i++){
query = queryparser.parse(searchwords[i], "title", language);
hits results = indexsearcher.search(query);
system.out.println(results.length() + "search results for query " +searchwords[i]);}<p></p>
<p></p>

域搜索(field search)

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

清单2:实现域搜索

<p>//test field search
public void testfieldsearch(string indexdirectory) throwsexception{
directory dir =fsdirectory.getdirectory(indexdirectory,false);
indexsearcher indexsearcher = new indexsearcher(dir);
string searchwords = "title:lucene and content:java";
analyzer language = new standardanalyzer();
query query = queryparser.parse(searchwords, "title",language);
hits results = indexsearcher.search(query);
system.out.println(results.length() + "search results for query " +searchwords);</p>
<p></p>

通配符搜索(wildcard search)

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

清单3:进行通配符查询

<p>//test wildcard search
public void testwildcardsearch(string indexdirectory)throwsexception{
directory dir =fsdirectory.getdirectory(indexdirectory,false);
indexsearcher indexsearcher = new indexsearcher(dir);
string[] searchwords = {"tex*", "tex?", "?ex*"};
query query;
for(int i = 0; i < searchwords.length; i++){
query = new wildcardquery(new term("title",searchwords[i]));
hits results = indexsearcher.search(query);
system.out.println(results.length() + "search results for query " +searchwords[i]);}</p>
<p></p>

模糊查询

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

清单4:实现模糊查询

<p>//test fuzzy search
public void testfuzzysearch(string indexdirectory)throwsexception{
directory dir =fsdirectory.getdirectory(indexdirectory,false);
indexsearcher indexsearcher = new indexsearcher(dir);
string[] searchwords = {"text", "funny"};
query query;
for(int i = 0; i < searchwords.length; i++){
query = new fuzzyquery(new term("title",searchwords[i]));
hits results = indexsearcher.search(query);
system.out.println(results.length() + "search results for query " +searchwords[i]);}</p>
<p></p>

范围搜索(range search)

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

清单5:测试范围搜索

<p>//test range search
public void testrangesearch(string indexdirectory)throwsexception{
directory dir =fsdirectory.getdirectory(indexdirectory,false);
indexsearcher indexsearcher = new indexsearcher(dir);
term begin = new term("birthday","20000101");
term end = newterm("birthday","20060606");
query query = new rangequery(begin,end,true);
hits results = indexsearcher.search(query);
system.out.println(results.length() + "search results isreturned");
}</p>

以上所述是小编给大家介绍的lucene实现多种高级搜索形式,希望对大家有所帮助

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网