时间:2021-05-20
布尔操作符
大多数的搜索引擎都会提供布尔操作符让用户可以组合查询,典型的布尔操作符有 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 operatorpublic 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 searchpublic 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 searchpublic 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 searchpublic 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 searchpublic 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实现多种高级搜索形式,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
基于Lucene实现网页的索引和搜索。Lucene是ApacheJakarta项目中的一个子项目。是一个由Java实现的,开源的全文检索引擎工具包。利用它提供的
检索器的实现。调用Lucene的搜索入口对索引进行查询,返回查询结果。检索时,用户提交检索关键字,先调用Lucene的查询分析器分析用户提交的查询,然后调用In
使用GroupingSearch对搜索结果进行分组Packageorg.apache.lucene.search.groupingDescription这个模块
一、ElasticSearch是什么?Elasticsearch也使用Java开发并使用Lucene作为其核心来实现所有索引和搜索的功能,但是它的目的是
solr是什么?solr是apache下的一个顶级开源项目,采用java开发,它是基于lucene的全文搜索服务器。solr提供了比lucene更为丰富的查询语