请问谁用过hibernate-search。我使用的时候出现两个问题:
 第一个问题是:
  出现的异常情况:
java.lang.StringIndexOutOfBoundsException: String index out of range: 2182
at java.lang.String.substring(String.java:1935)
at org.apache.lucene.search.highlight.Highlighter.getBestTextFragments(Highlighter.java:271)
at org.apache.lucene.search.highlight.Highlighter.getBestFragments(Highlighter.java:175)
at org.apache.lucene.search.highlight.Highlighter.getBestFragments(Highlighter.java:460)
at cn.org.coral.biz.cms.service.CmsContentService.fullTextSearch(CmsContentService.java:170)第二个问题是重复的问题: 比如说:搜索内容"3G",得到的展现内容中有“33G”。代码方法为:
public Object[] fullTextSearch(int kind,String text, int startrow, int pagesize) {
Object[] rt = new Object[]{new Integer(0),new ArrayList()};
FullTextSession fullTextSession = Search.createFullTextSession(getSession());

Analyzer analyzer = new PaodingAnalyzer();
QueryParser parser = null;
switch(kind){
case 1:
parser = new QueryParser("cmsname", analyzer);
break;
case 2:
parser = new QueryParser("keywords", analyzer);
break;
case 3:
parser = new QueryParser("summary", analyzer);
break;
case 4:
parser = new QueryParser("contents", analyzer);
break;
case 5:
return cmsFileService.fileSearch(new String[]{"filecontents","title"}, text, startrow, pagesize);
default:
parser = new MultiFieldQueryParser(new String[]{"cmsname","keywords","summary","contents","availabilitytime"}, analyzer);

}

Query luceneQuery = null;
try {
luceneQuery = parser.parse(text);

org.hibernate.search.FullTextQuery query = fullTextSession
.createFullTextQuery(luceneQuery, CmsContent.class);
query.setProjection("oid","cmsname","keywords","summary","status","contents","usualname","areaname","deptname","hurrayleval");
query.enableFullTextFilter("statusFilter");
rt[0] = query.getResultSize();
query.setFirstResult(startrow);
query.setMaxResults(pagesize);
rt[1] = query.list();

SimpleHTMLFormatter simpleHTMLFormatter = new SimpleHTMLFormatter(
lefttag, righttag);
Highlighter highlighter = new Highlighter(simpleHTMLFormatter, new QueryScorer(
luceneQuery));
//SimpleFragmenter sf = new SimpleFragmenter(100);
//sf.setFragmentSize(3000);


highlighter.setTextFragmenter(new SimpleFragmenter(100));
//highlighter.setTextFragmenter(sf);
ArrayList<Object[]> list = (ArrayList<Object[]>)rt[1];
for (int i=0; i<list.size(); i++) {
Object[] cms = list.get(i);
String htext = (String)cms[5];
if(UtilString.isEmpty(htext))
continue;
TokenStream tokenStream = analyzer.tokenStream("contents", new StringReader(htext));
try {
//htext = highlighter.getBestFragment(tokenStream, htext);
htext = highlighter.getBestFragments(tokenStream, htext, 8, "");

} catch (IOException e) {
logger.error("Error while highlighter the text! ", e);
}
cms[5] = htext;
}
} catch (ParseException e) {
e.printStackTrace();
}
return rt;
}
  

解决方案 »

  1.   

    没有,我看了内容的。是“3G”。没有33G,当输入“3 G”,空格查询下的时候。不会出现33G,
      

  2.   

    楼主,你一定知道这个问题
    帮我看一下哦<property name="hibernate.search.default.indexBase"> 
       d:\index 
      </property> 
    这样写是可以的, 但是以下就不知道了,是个错误的 
     <property name="hibernate.search.default.indexBase"> 
       classpath:indexdoc   </property>  
    //放在WEB-INF\classes\indexdoc 下 怎么写啊 
    还有以下问题不解,望告知.   QueryParser parser = new QueryParser("newstitle", new StandardAnalyzer()); 
       org.apache.lucene.search.Query luceneQuery = null; 
    try { 
    luceneQuery = parser.parse(newstitle); // build Lucene query 
    } catch (ParseException e) { 
    e.printStackTrace(); 
                } 
    这个是对newstitle新闻标题进行查询,能不能对新闻所有记录查询啊?