安全过滤器:限制匹配范围
下面的例子里面,有两个索引文档,两者在关键字域里面都包含info项,但是每个文档属于不同的所有者;如果不使用过滤器的话,我们会搜索召两个文档。考虑到安全性,这当然不是我们想要的结果,因此我们可以使用QueryWrapperFilter将搜索空间限制在某个用于所拥有的文档范围之内。
示例代码:
package com.tan.code;
import java.io.IOException;
import java.util.logging.Filter;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.StringField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.QueryWrapperFilter;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;
public class SecurityFilterTest {
private IndexWriter indexWriter = null;
private IndexSearcher indexSearcher = null;
public void securityFilter() throws IOException {
//写入内存
Directory directory = new RAMDirectory();
indexWriter = new IndexWriter(directory, new IndexWriterConfig(
Version.LUCENE_43, new StandardAnalyzer(Version.LUCENE_43)));
Document document = new Document();
// LiMing
document.add(new StringField("id", "1", Store.YES));
document.add(new TextField("owner", "LiMing", Store.YES));
document.add(new TextField("keywords", "LiMing Info", Store.YES));
indexWriter.addDocument(document);
// TanWeiJie
document = new Document();
document.add(new StringField("id", "2", Store.YES));
document.add(new TextField("owner", "TanWeiJie", Store.YES));
document.add(new TextField("keywords", "TannWeiJie Info", Store.YES));
indexWriter.addDocument(document);
indexWriter.commit();
indexWriter.close();
IndexReader r = DirectoryReader.open(directory);
indexSearcher = new IndexSearcher(r);
// 不使用过滤器
TermQuery termQuery = new TermQuery(new Term("keywords", "info"));
System.out.println("不使用过滤器匹配到"
+ indexSearcher.search(termQuery, 10).totalHits + "个结果");
// 使用过滤器
QueryWrapperFilter limingfilter = new QueryWrapperFilter(new TermQuery(
new Term("owner", "liming"))); // 注意这里需要小写,使用Luke查看索引的時候就可以發現分詞器都把大寫轉換成小寫
System.out.println("使用过滤器匹配到"
+ indexSearcher.search(termQuery, limingfilter, 10).totalHits
+ "个结果");
}
}
测试代码:
@Test
public void test() throws IOException {
//fail("Not yet implemented");
SecurityFilterTest securityFilterTest=new SecurityFilterTest();
securityFilterTest.securityFilter();
}
输出结果:
不使用过滤器匹配到2个结果
使用过滤器匹配到1个结果
【参考《Lucene In Action》】
分享到:
相关推荐
4. **过滤器(Filter)**:可以限制搜索结果,如按日期范围、文档类型等条件筛选。 5. **高亮显示**:突出显示查询词在文档中的位置,提高用户体验。 6. **分页与分块检索**:对于大量结果,可以使用 TopDocs 分页...
5. **过滤器(Filter)**:可以用于进一步筛选结果,比如限制搜索范围在特定的线路或区域。 **系统架构设计:** - **前端展示**:用户界面可能使用JavaFX或Swing进行开发,提供友好的图形化操作,用户输入查询条件...
过滤器在Lucene中用于限制搜索结果或对索引进行操作。例如,`TermRangeFilter`允许根据词项范围筛选文档,而`NumericRangeFilter`则支持数值范围的过滤。`QueryFilter`则根据一个查询来过滤结果。 **5. 更新与删除...
- Lucene是Apache基金会的一个开源项目,提供了强大的文本搜索能力。 - 可以轻松集成到任何应用中,提供高级的搜索功能。 - **2.2.4 Nutch网络搜索软件** - Nutch是一个开源框架,基于Hadoop和Lucene构建。 - ...
3. 搜索性能:优化查询语句,避免全表扫描,合理使用过滤器和限制返回结果的数量。 4. 安全性:确保索引文件的安全性,防止未授权访问。 总之,Hibernate Search 4.5.2.Final是Java开发人员实现高效全文检索的强大...
12. **插件扩展**:Solr的灵活性体现在其强大的插件体系,开发者可以根据需求编写自定义查询解析器、请求处理器、过滤器等。 13. **数据分析**:Solr可以集成Hadoop等大数据处理框架,进行复杂的数据分析和预处理。...
动态筛选条件允许用户根据不同的字段进行筛选,如评论内容、自定义字段等,同时还可以设定过滤器来限定搜索结果。 5. 权限管理 权限管理是企业协作服务中非常重要的部分。在Elasticsearch中,需要区分可以访问的...
- **查询优化**:避免全字段匹配,使用过滤器代替查询,限制返回结果数量。 6. **Elasticsearch实战** - **日志分析**:收集、存储和分析系统日志,实时监控应用状态。 - **实时搜索**:在电商、新闻网站等场景...
Elasticsearch是一个开源的全文搜索引擎,它基于Lucene库,由Apache软件基金会开发并维护。在Java平台上运行,Elasticsearch提供了分布式、实时、高可用性的搜索和数据分析能力。这个"elasticsearch.zip"安装资源...
Elasticsearch(简称ES)是一款开源的全文搜索引擎,基于Lucene构建,设计用于分布式、实时、可扩展的数据存储和搜索。它不仅提供了搜索功能,还支持数据分析和可视化,广泛应用于日志分析、监控、大数据处理等领域...