• lucene查询之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对象进行查询时,查询关键字前不能有“?”和“*”。

  • 相关阅读:
    vb动态创建控件
    100多个很有用的JavaScript函数以及基础写法汇总
    CodeFile与CodeBehind的区别
    asp.net防sql注入问题
    .NET创建目录和文件
    Asp.Net判断字符是否是数字
    Asp.Net随机中文汉字验证码
    禁用表单自动提示complete
    如何隐藏vs2005的起始页
    Asp.Net enableEventValidation
  • 原文地址:https://www.cnblogs.com/likehua/p/2353736.html
Copyright © 2020-2023  润新知