这是事情。我有存储在索引中,其中包含特殊字符的术语,如“ - ”,最简单的代码是这样的:如何使用QueryParser执行包含特殊字符的lucene查询?
Document doc = new Document();
doc.add(new TextField("message", "1111-2222-3333", Field.Store.YES, Field.Index.NOT_ANALYZED));
writer.addDocument(doc);
然后我创建使用的QueryParser查询,像这样:
String queryStr = "1111-2222-3333";
QueryParser parser = new QueryParser(Version.LUCENE_36, "message", new StandardAnalyzer(Version.LUCENE_36));
Query q = parser.parse(queryStr);
然后我使用搜索器来搜索查询并得不到结果。我也试过这个:
Query q = parser.parse(QueryParser.escape(queryStr));
而且还是没有结果。
不使用的QueryParser,而是使用TermQuery直接可以做我想做的,但这种方式并不为用户输入文本不够灵活。
我想,也许是StandardAnalyzer做了省略在查询字符串的特殊字符。我尝试了调试,发现字符串被拆分,实际查询如下所示:“message:1111 message:2222 message:3333”。我不知道究竟是什么Lucene的做...
所以,如果我想用特殊字符执行查询,我该怎么办?我应该重写一个分析器还是继承一个默认的查询分析器?而如何...
更新:在这个问题说,但它仍然无法正常工作
1 @The新白痴@femtoRgon,我已经试过QueryParser.escape(queryStr)。
2我试过另一种方法来解决问题。我从Tokenizer派生了一个QueryTokenizer,并且只通过空格来裁剪这个词,将它打包到派生自Analyzer的QueryAnalyzer中,最后将QueryAnalyzer传递给QueryParser。
现在,它的工作。最初它不起作用,因为默认StandardAnalyzer根据默认规则(将一些特殊字符识别为分隔符)剪切queryStr,当查询传递到QueryParser时,特殊字符已被StandardAnalyzer删除。现在我用我自己的方式来切断queryStr,它只将空间识别为分隔符,所以特殊字符保留在查询中等待处理,并且这可以工作。
3 @The新白痴@femtoRgon,感谢你回答我的问题。
道歉,我显然没有仔细阅读。但我很困惑:这个'TextField'来自哪里? Lucene的'TextField'不带'Field.Index'参数('Field.Index'已弃用)。要创建一个像这里一样的字段,你应该使用'StringField'。这是某种自定义的'TextField'或什么的? – femtoRgon
对不起,这是我的错。我使用的是Lucene 3.6,Lucene 3.x中没有TextField。正确的代码应该是:'doc.add(new Field(“message”,“1111-2222-3333”,Field.Store.YES,Field.Index.NOT_ANALYZED));'Lucene 4.x和3.x API是非常不同的,我仍然试图理解lucene 4.x API。 –
啊,更有意义。有点偏离主题,但如果你正试图掌握4.x中的变化,你是否看过[迁移指南](http://lucene.apache.org/core/4_0_0/MIGRATE.html)?它呼吁进行重大改变,并提供一些理由。 – femtoRgon