luceneクエリのWildcardQueryエラー(メモ)
5462 ワード
マルチフィールド構造クエリーをテストしました.コードは次のとおりです.
私が検索したキーワードは「?府」です.その結果、バックグラウンドで直接エラーが発生しました.エラーメッセージは次のとおりです.
エラーメッセージにより、WildCardQueryオブジェクトを使用してクエリーを行う場合、キーワードをクエリーする前に「?」と「*」です.
try {
long start=System.currentTimeMillis();
Directory dic = new SimpleFSDirectory(new File(ILuceneManager.DEFAULT_REGION_LUCENE_INDEX_PATH));
IndexSearcher searcher=new IndexSearcher(dic);
//----------
//searcher.setSimilarity(new IKSimilarity());
//----------- StandardAnalyzer IKAnalyzer
Analyzer analyzer=new StandardAnalyzer(Version.LUCENE_CURRENT);
//Analyzer analyzer=new IKAnalyzer(true);
String[] fields=new String[]{"NAME","USERNAME","weight","STANDARDNAME","ADDRESS"};
MultiFieldQueryParser multiQParser=new MultiFieldQueryParser(Version.LUCENE_CURRENT, fields, analyzer);
//----------
String keyword="? ";
Query query=multiQParser.parse(keyword);
//------------
//searcher.search(query, LuceneManagerImpl.DEFAULT_QUERY_NUM);
TopDocs tops=searcher.search(query,10);
ScoreDoc[] scores=tops.scoreDocs;
int length=tops.totalHits;
for(int i=0;i<(length>LuceneManagerImpl.DEFAULT_QUERY_NUM?LuceneManagerImpl.DEFAULT_QUERY_NUM:length);i++){
Document targetDoc=searcher.doc(scores[i].doc);
//System.out.println(targetDoc.getFields("NAME")[0].stringValue());
//System.out.println(targetDoc.getFields("ADDRESS")[0].stringValue());
//System.out.println(targetDoc.get("NAME"));
System.out.println(targetDoc.get("ADDRESS"));
System.out.println(targetDoc.get("USERNAME"));
System.out.println(targetDoc.get("NAME"));
};
long end=System.currentTimeMillis();
System.out.println(" :"+(end-start)+" ");
私が検索したキーワードは「?府」です.その結果、バックグラウンドで直接エラーが発生しました.エラーメッセージは次のとおりです.
org.apache.lucene.queryParser.ParseException: Cannot parse '? ': '*' or '?' not allowed as first character in WildcardQuery
at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:187)
at com.geostar.test.poi.dao.LuceneManagerTest.testMultipleFieldQuery(LuceneManagerTest.java:79)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.test.context.junit4.SpringTestMethod.invoke(SpringTestMethod.java:160)
at org.springframework.test.context.junit4.SpringMethodRoadie.runTestMethod(SpringMethodRoadie.java:233)
at org.springframework.test.context.junit4.SpringMethodRoadie$RunBeforesThenTestThenAfters.run(SpringMethodRoadie.java:333)
at org.springframework.test.context.junit4.SpringMethodRoadie.runWithRepetitions(SpringMethodRoadie.java:217)
at org.springframework.test.context.junit4.SpringMethodRoadie.runTest(SpringMethodRoadie.java:197)
at org.springframework.test.context.junit4.SpringMethodRoadie.run(SpringMethodRoadie.java:143)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.invokeTestMethod(SpringJUnit4ClassRunner.java:160)
at org.junit.internal.runners.JUnit4ClassRunner.runMethods(JUnit4ClassRunner.java:51)
at org.junit.internal.runners.JUnit4ClassRunner$1.run(JUnit4ClassRunner.java:44)
at org.junit.internal.runners.ClassRoadie.runUnprotected(ClassRoadie.java:27)
at org.junit.internal.runners.ClassRoadie.runProtected(ClassRoadie.java:37)
at org.junit.internal.runners.JUnit4ClassRunner.run(JUnit4ClassRunner.java:42)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:97)
at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:49)
at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: org.apache.lucene.queryParser.ParseException: '*' or '?' not allowed as first character in WildcardQuery
at org.apache.lucene.queryParser.QueryParser.getWildcardQuery(QueryParser.java:923)
at org.apache.lucene.queryParser.MultiFieldQueryParser.getWildcardQuery(MultiFieldQueryParser.java:175)
at org.apache.lucene.queryParser.MultiFieldQueryParser.getWildcardQuery(MultiFieldQueryParser.java:170)
at org.apache.lucene.queryParser.QueryParser.Term(QueryParser.java:1347)
at org.apache.lucene.queryParser.QueryParser.Clause(QueryParser.java:1250)
at org.apache.lucene.queryParser.QueryParser.Query(QueryParser.java:1178)
at org.apache.lucene.queryParser.QueryParser.TopLevelQuery(QueryParser.java:1167)
at org.apache.lucene.queryParser.QueryParser.parse(QueryParser.java:182)
... 24 more
エラーメッセージにより、WildCardQueryオブジェクトを使用してクエリーを行う場合、キーワードをクエリーする前に「?」と「*」です.