Lucene 4.2 StringField

Lucene 4.2 StringField,lucene,Lucene,我是Lucene的新手。我有两个文档,我希望与名为“关键字”的文档字段完全匹配(该字段可能在一个文档中出现多次) 第一个文档包含关键字“Annotation is cool”。第二个文档包含关键字“Annotation也很酷”。当我搜索“Annotation is cool”时,我必须如何构建查询,以便只找到第一个文档 我读了一些关于“StringField”的东西,它没有标记化。如果我在方法“addDoc”中将“关键字”字段从“TextField”更改为“StringField”,那么将找不到

我是Lucene的新手。我有两个文档,我希望与名为“关键字”的文档字段完全匹配(该字段可能在一个文档中出现多次)

第一个文档包含关键字“Annotation is cool”。第二个文档包含关键字“Annotation也很酷”。当我搜索“Annotation is cool”时,我必须如何构建查询,以便只找到第一个文档

我读了一些关于“StringField”的东西,它没有标记化。如果我在方法“addDoc”中将“关键字”字段从“TextField”更改为“StringField”,那么将找不到任何内容

这是我的密码:

私有索引编写器;
public void lucene()引发IOException,ParseException{
//建立索引
StandardAnalyzer=新的StandardAnalyzer(版本.LUCENE_42);
目录索引=新的RAMDirectory();
IndexWriterConfig config=新的IndexWriterConfig(Version.LUCENE_42,
分析仪);
this.writer=newindexwriter(索引,配置);
//将文档添加到索引中
addDoc(“Spring”,新字符串[]{“Java”,“JSP”,
“注释很酷”});
addDoc(“Java”,新字符串[]{“Oracle”,“注解也很酷”});
writer.close();
//搜索索引
IndexReader=DirectoryReader.open(索引);
IndexSearcher search=新的IndexSearcher(阅读器);
BooleanQuery qry=新的BooleanQuery();
qry.add(新术语查询(新术语(“关键字”,“注释很酷”))、BooleanClause.occure.MUST);
System.out.println(qry.toString());
Query q=new QueryParser(Version.LUCENE_42,“title”,analyzer.parse(qry.toString());
int hitsPerPage=10;
TopScoreDocCollector=TopScoreDocCollector.create(
命中率,正确);
搜索者。搜索(q,收集器);
ScoreDoc[]hits=collector.topDocs().scoreDocs;
对于(int i=0;i
问题不在于如何为字段编制索引。字符串字段是将整个输入作为单个标记进行索引的正确方法。问题在于你是如何搜索的。我真的不知道你打算用这种逻辑来完成什么,真的

BooleanQuery qry = new BooleanQuery();
qry.add(new TermQuery(new Term("keyword", "\"Annotation is cool\"")), BooleanClause.Occur.MUST);
//Great! You have a termQuery added to the parent BooleanQuery which should find your keyword just fine!

Query q = new QueryParser(Version.LUCENE_42, "title", analyzer).parse(qry.toString());
//Now all bets are off.
Query.toString()
是一种方便的调试方法,但假设通过QueryParser运行输出文本查询将重新生成相同的查询是不安全的。标准查询解析器实际上没有太多的能力将多个单词表示为一个术语。我相信,您看到的字符串版本如下所示:

keyword:"Annotation is cool"
这将被解释为短语查询。一个短语查询将查找三个连续的术语:Annotation、is和cool,但按照索引的方式,只有一个术语“Annotation is cool”

解决办法是永远不要使用像这样的逻辑

 Query nuttyQuery = queryParser.parse(perfectlyGoodQuery.toString());
 searcher.search(nuttyQuery);
相反,只需使用您已经创建的布尔查询进行搜索

 searcher.search(perfectlyGoodQuery);

非常感谢你的帮助。如果我用“Query q…”取消对该行的注释,并将“searcher.search(…)”中的参数“q”更改为“qry”,则找不到任何内容。我还更改为StringField,但没有成功。看起来只有在构造查询时才使用引号将其括起来,而不是在索引时,所以请从查询项中删除引号。