java lucene classification query-parser

java - Lucene: excepción: el analizador de consultas encontró<EOF> después de "alguna palabra"



classification query-parser (2)

Debes escapar de la comilla doble y otros caracteres especiales a través de

Query query = parser.parse(QueryParser.escape(parsedReview));

Como el Javadoc QueryParser.escape sugirió,

Devuelve una cadena en la que los caracteres de los que QueryParser espera que se escape se escapan por un ''/' precedente.

Estoy trabajando en un problema de clasificación para clasificar las revisiones de productos como positivas, negativas o neutrales según los datos de capacitación utilizando la API de Lucene.

Estoy usando un ArrayList of Review objetos - "reviewList" que almacena los atributos para cada revisión mientras rastrea las páginas web.

Los atributos de revisión que incluyen "polaridad" y "contenido de revisión" se indexan mediante el indexador. A partir de entonces, según los objetos de índices, debo clasificar los objetos de revisión restantes. Pero al hacerlo, hay un objeto de revisión para el cual el analizador de consultas se encuentra con un carácter EOF en el "contenido de revisión", y por lo tanto termina.

La línea que causa el error ha sido comentada en consecuencia.

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;

He analizado el texto manualmente para eliminar los caracteres que causan el error, además de verificar si la siguiente cadena es nula ... pero el error persiste.

Este es el seguimiento de la pila de error -

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

Por favor, ayúdame a resolver este problema ... ¡Me he estado golpeando la cabeza con esto durante horas!


Reconozco este problema.

La declaración de GROUP BY antes de la declaración WHERE funciona bien en Teradata, pero arroja un error al analizar.

Para corregirlo, mueva la declaración GROUP BY después de la declaración WHERE .