1

我正在使用 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()));

但是,查询返回为空。我期待像“hello world,this is lucene”这样的关键字会导致带状疱疹[hello world this is,world this is lucene,this is lucene]

让我知道我对 ShingleAnalyzerWrapper 的期望和使用是否正确。

谢谢,瑞安

4

2 回答 2

2

也许这是一个复制/粘贴错误,但在您的代码片段中,实际上并未使用 shingleAnalyzer,因为您将变量 keywordAnalyzer 传递给查询解析器。您在索引时使用什么分析器?

如果您使用过滤掉停用词的分析器作为 ShingleAnalyzerWrapper 的委托分析器,则停用词(在您的示例中为“this”和“is”)将在 shingle 分析器有机会从中创建 shingles 之前被删除。

调试分析器的一个好方法是使用“Lucene in Action”中描述的 AnalyzerUtils 之类的东西。您可以在此处获取示例代码:http: //java.codefetch.com/example/in/LuceneInAction/src/lia/analysis/AnalyzerUtils.java

尼基塔

于 2011-06-30T13:37:53.260 回答
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。我需要更多的挖掘来弄清楚根本原因是什么,但你让我知道了从哪里开始。

于 2011-07-06T18:25:20.157 回答