我有以下情况 我有一组索引文件。但我需要选择我的索引。
选择标准:文档必须包含给定Set
中的一个关键字。
这部分很简单,我可以检查文档中是否存在这些关键字,然后才对文档编制索引。 棘手的情况是(对我来说无论如何!),我想只索引这些关键字。这些关键字也可以是多重的,也可以是正则表达式。
这些关键字对于这篇文章来说是没有意义的,因为我可以抽象出来 - 我可以生成需要编制索引的关键字列表。
我可以使用现有的TokenStream,Analyzer,Filter组合吗? 如果没有,请有人指出我正确的方向。
如果我的问题不够明确:
HashSet<String> impKeywords = new HashSet<String>(new String[] {"Java", "Lucene"});
我有一个课程Content
,我会说:
Content content = new Content("I am only interested in Java, Lucene, Nutch, Luke, CommonLisp.");
并说,我有一种方法可以获得匹配的关键字:
HashSet<String> matchingKeywords = content.getMatchingKeywords(impKeywords); // returns a set with "Java" and "Lucene"
如果有匹配的关键字,则只进行索引文档;这样:
if(!matchingKeywords.isEmpty()) {
// prepare document for indexing, and index.
// But what should be my Analyzer and TokenStream?
}
我希望能够使用只返回这些匹配关键字的TokenStream创建一个Analyzer,因此只有这些标记被编入索引。
结束备注:似乎有一种可能性是,对于每个文档,我都会为每个匹配的关键字添加可变数量的字段。这些字段在哪里被索引但未使用Field.Index.NOT_ANALYZED
进行分析。但是,如果我能够为此目的找出预先存在的Analyzer / TokenStream而不是使用字段,那会更好。
答案 0 :(得分:0)
按照@ femtoRgon的建议我已经解决了上述问题如下。
如问题所述,我有:
HashSet<String> impKeywords = new HashSet<String>(new String[] {"Java", "Lucene"});
我使用了一个Content
课程,如下所示:
Content content = new Content("I am only interested in Java, Lucene, Nutch, Luke, CommonLisp.");
而且,我有一种获取匹配关键字的方法:
HashSet<String> matchingKeywords = content.getMatchingKeywords(impKeywords); // returns a set with "Java" and "Lucene" for this example `content`.
如果有匹配的关键字,则只进行索引文档;所以在编制索引时我做了:
if(!matchingKeywords.isEmpty()) {
Document doc = new Document();
for(String keyword: matchingKeywords) {
doc.add(new Field("keyword", keyword, Field.Store.YES, Field.Index.NOT_ANALYZED);
}
iwriter.addDocument(doc); // iwriter is the instance of IndexWriter
}
然后,在搜索时我创建了以下布尔查询:
BooleanQuery boolQuery = new BooleanQuery();
for(String queryKeyword: searchKeywords)) {
boolQuery.add(new TermQuery(new Term("keyword", queryKeyword)), BooleanClause.Occur.SHOULD);
}
ScoreDoc[] hits = isearcher.search(boolQuery, null, 1000).scoreDocs; // isearcher is the instance of IndexSearcher
希望这个答案可以帮助有类似需求的人。