在建立索引期间创建org.apache.lucene.document.Document
时,我创建了一个org.apache.lucene.document.StringField
,其中包含多个空格,例如“ID____45_2013”。我使用org.apache.lucene.analysis.standard.StandardAnalyzer
来创建索引并查询它。
使用包含多个空格的短语查询索引时,例如“ID__45_2013”(其中_是空格)我得到一个空的结果。
我使用luke检查了我的查询,并意识到多个空格被解析为一个空格。
如何才能在查询词组中使用多个空格并获得正确的结果?
答案 0 :(得分:4)
问题不仅仅是多个空间。如果您只有一个空格,那么您的查询将被标记化,而索引数据则不会(因为它是使用StringField
创建的)。您将搜索令牌ID
,45
,2013
与单个令牌ID 45 2013
,这样仍然无法获得结果。
您可以将该字段保留为StringField
,并将QueryParser使用的Analyzer设置为KeywordAnalyzer
。当然,你仍然需要小心查询语法,但引用上面提到的字符串应该可以解决问题。
我认为,查询StringFields
的更好方法是自己构建TermQuery
。这使您无需担心分析仪。只需创建如下查询:
Query query = new TermQuery(new Term("id", "ID 45 2013"));
您还可以,如果您希望使用类似于您所提到的短语查询,则应使用TextField,使用与查询相同的分析器进行分析(StandardAnalyzer
,在此情况下)。这将提供更多的自由文本搜索功能,如果这是您正在寻找的。我并不认为这是所希望的代表,而是供你考虑。
答案 1 :(得分:0)