我正在使用hibernate-search-3.2.1.Final,并希望将我的输入解析为带状疱疹。从我在文档中看到的内容来看,ShingleAnalyzerWrapper似乎正是我所需要的。我已经使用WhitespaceAnalyzer,StandardAnalyzer和SnowballAnalyzer作为ShingleAnalyzerWrapper的默认分析器进行了测试。
Version luceneVersion = Version.LUCENE_29;
SnowballAnalyzer keywordAnalyzer= new SnowballAnalyzer(luceneVersion, "English", StopAnalyzer.ENGLISH_STOP_WORDS_SET);
ShingleAnalyzerWrapper shingleAnalyzer = new ShingleAnalyzerWrapper(keywordAnalyzer, 4);
shingleAnalyzer.setOutputUnigrams(false);
QueryParser keywordParser = new QueryParser(luceneVersion, "keyword", keywordAnalyzer);
Query keywordQuery = keywordParser.parse(QueryParser.escape(keyword.toLowerCase()));
然而,查询回来了。我期待关键词如“你好世界,这是Lucene”导致带状疱疹[你好世界这是,世界这是lucene,这是lucene]
如果我对ShingleAnalyzerWrapper的期望和用法是正确的,请告诉我。
谢谢, 莱恩
答案 0 :(得分:2)
可能是复制/粘贴错误,但在您的代码片段中,实际上并没有使用shingleAnalyzer,因为您将变量keywordAnalyzer传递给查询解析器。您在索引时使用了什么分析器?
如果使用过滤掉停用词的分析器作为ShingleAnalyzerWrapper的委托分析器,则在木瓦分析器有机会从它们创建带状疱疹之前,将停止停用词(在您的示例中为“this”和“is”)。
调试分析器的一个好方法是使用“Lucene in Action”中描述的AnalyzerUtils。您可以在此处获取示例代码:http://java.codefetch.com/example/in/LuceneInAction/src/lia/analysis/AnalyzerUtils.java
尼基塔
答案 1 :(得分:1)
谢谢尼基塔!是的,这是一个复制粘贴错误,但正确的版本仍能产生正确的结果。
您在AnalyzerUtils上的链接是一个很好的帮助,因为我能够使用以下代码生成带状疱疹:
ShingleAnalyzerWrapper shingleAnalyzer = new ShingleAnalyzerWrapper(4);
shingleAnalyzer.setOutputUnigrams(false);
TokenStream stream = shingleAnalyzer.tokenStream("contents", new StringReader("red dress shoes with black laces"));
ArrayList tokenList = new ArrayList();
while (true) {
Token token = null;
try {
token = stream.next();
} catch (IOException e) {
e.printStackTrace();
}
if (token == null) break;
tokenList.add(token);
}
产生:
[(red dress,0,9,type=shingle), (red dress shoes,0,15,type=shingle,posIncr=0), (red dress shoes black,0,26,type=shingle,posIncr=0), (dress shoes,4,15,type=shingle), (dress shoes black,4,26,type=shingle,posIncr=0), (dress shoes black laces,4,32,type=shingle,posIncr=0), (shoes black,10,26,type=shingle), (shoes black laces,10,32,type=shingle,posIncr=0), (black laces,21,32,type=shingle)]
问题不在于ShingleAnalyzerWrapper本身,而在于QueryParser。我需要更多的挖掘来找出根本原因是什么,但是你给我一些从哪里开始。