【问题标题】:Lucene: exception - Query parser encountered <EOF> after "some word"Lucene:异常 - 查询解析器在“某个单词”之后遇到 <EOF>
【发布时间】:2012-05-02 20:18:54
【问题描述】:

我正在研究一个分类问题,根据使用 Lucene API 的训练数据将产品评论分类为正面、负面或中性。

我正在使用评论对象的 ArrayList - “reviewList”,它在抓取网页时存储每个评论的属性。

然后使用索引器对包括“极性”和“评论内容”的评论属性进行索引。此后,根据索引对象,我需要对剩余的评论对象进行分类。但是在这样做的同时,查询解析器在“评论内容”中遇到了一个 EOF 字符,因此终止了一个评论对象。

导致错误的行已相应注释 -

    IndexReader reader = IndexReader.open(FSDirectory.open(new File("index")));
    IndexSearcher searcher = new IndexSearcher(reader);
    Analyzer analyzer = new StandardAnalyzer(Version.LUCENE_31);
    QueryParser parser = new QueryParser(Version.LUCENE_31, "Review", analyzer);

    int length = Crawler.reviewList.size();
    for (int i = 200; i < length; i++) {
        String true_class;
        double r_stars = Crawler.reviewList.get(i).getStars();

        if (r_stars < 2.0) {
            true_class = "-1";
        } else if (r_stars > 3.0) {
            true_class = "1";
        } else {
            true_class = "0";
        }

        String[] reviewTokens = Crawler.reviewList.get(i).getReview().split(" ");
        String parsedReview = "";

        int j;

        for (j = 0; j < reviewTokens.length; j++) {
            if (reviewTokens[j] != null) {
                if (!((reviewTokens[j].contains("-")) || (reviewTokens[j].contains("!")))) {
                    parsedReview += reviewTokens[j] + " ";
                }
            } else {
                break;
            }
        }

        Query query = parser.parse(parsedReview); // CAUSING ERROR!!

        TopScoreDocCollector results = TopScoreDocCollector.create(5, true);
        searcher.search(query, results);
        ScoreDoc[] hits = results.topDocs().scoreDocs;

我已手动解析文本以删除导致错误的字符,除了检查下一个字符串是否为空......但错误仍然存​​在。

这是错误堆栈跟踪 -

Exception in thread "main" org.apache.lucene.queryParser.ParseException: Cannot parse 'I made the choice ... be all "thumbs ': Lexical error at line 1, column 938.  Encountered: <EOF> after : "\"thumbs "
at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:216)
at Sentiment_Analysis.Classification.classify(Classification.java:58)
at Sentiment_Analysis.Main.main(Main.java:17)
Caused by: org.apache.lucene.queryParser.TokenMgrError: Lexical error at line 1, column 938.  Encountered: <EOF> after : "\"thumbs "
at org.apache.lucene.queryParser.QueryParserTokenManager.getNextToken(QueryParserTokenManager.java:1229)
at org.apache.lucene.queryParser.QueryParser.jj_scan_token(QueryParser.java:1709)
at org.apache.lucene.queryParser.QueryParser.jj_3R_2(QueryParser.java:1598)
at org.apache.lucene.queryParser.QueryParser.jj_3_1(QueryParser.java:1605)
at org.apache.lucene.queryParser.QueryParser.jj_2_1(QueryParser.java:1585)
at org.apache.lucene.queryParser.QueryParser.Clause(QueryParser.java:1280)
at org.apache.lucene.queryParser.QueryParser.Query(QueryParser.java:1266)
at org.apache.lucene.queryParser.QueryParser.Clause(QueryParser.java:1313)
at org.apache.lucene.queryParser.QueryParser.Query(QueryParser.java:1266)
at org.apache.lucene.queryParser.QueryParser.TopLevelQuery(QueryParser.java:1226)
at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:206)
... 2 more
Java Result: 1

请帮我解决这个问题...我已经为此苦恼了好几个小时了!

【问题讨论】:

    标签: java lucene classification query-parser


    【解决方案1】:

    你应该通过

    转义双引号和其他特殊字符
    Query query = parser.parse(QueryParser.escape(parsedReview));
    

    正如QueryParser.escape Javadoc 建议的那样,

    返回一个字符串,其中 QueryParser 期望的那些字符 escaped 被前面的 '\' 转义。

    【讨论】:

    • 非常感谢!这是现场..:D
    • 对于那些使用更新版本(对我来说是 Lucene 4.6)的用户,escape 函数已移至 QueryParserUtil 类。
    • 我想用 solr 库而不是 lucene 库来做这个,有什么想法吗?
    • @ChunliangLyu in Lucene 4.10.4 escape() 仍在 QueryParser 中(继承自 QueryParserBase),但正如您提到的,QueryParserUtil 中也有一个。 -我想知道有什么区别..?
    • @Superole 是的,你是对的,QueryParser 继承了 QueryParserBase 的方法。我检查了当前版本中的QueryParserBaseQueryParserUtil 的实现,结果它们完全一样。所以没有功能差异,也许是一些微小的性能差异。
    【解决方案2】:

    我认识到这个问题。

    WHERE 声明之前声明 GROUP BY 在 Teradata 中可以正常工作,但在解析时会引发错误。

    要解决此问题,请将 GROUP BY 声明移到 WHERE 声明之后。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-09
      • 2010-09-22
      • 1970-01-01
      • 1970-01-01
      • 2011-08-13
      • 2021-12-22
      相关资源
      最近更新 更多