请问谁用过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;
}
第一个问题是:
出现的异常情况:
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;
}
帮我看一下哦<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新闻标题进行查询,能不能对新闻所有记录查询啊?