Hibernate搜索ShingleAnalyzerWrapper工作示例

时间:2011-03-10 01:59:44

标签: hibernate lucene full-text-search hibernate-search

我正在使用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的期望和用法是正确的,请告诉我。

谢谢, 莱恩

2 个答案:

答案 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。我需要更多的挖掘来找出根本原因是什么,但是你给我一些从哪里开始。