- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在阅读有关使用 Lucene 的 Hibernate 搜索引擎的信息,并且我能够在通过 mysql 数据库保存文章的 Article 类上按如下方式进行设置。我的目标是向用户显示他们在浏览器上搜索的文章标题和文本片段。这是我到目前为止所实现的:
@Entity
@Indexed
@Analyzer(impl = StandardAnalyzer.class)
@Table(name = "ARTICLE", catalog = "kefet3")
public class Article implements java.io.Serializable {
private static final long serialVersionUID = 1L;
// Fields
private Integer id;
private Articlelanguage articlelanguage;
private Users users;
private Articlecategory articlecategory;
@Analyzer(impl = StandardAnalyzer.class)
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO)
private String artTitle;
@Field(index = Index.YES, analyze = Analyze.YES, store = Store.NO)
private String artContent;
对于上面的代码,有 get 和 set 以及数据库的所有注释。
下面是搜索的方法。
@Override
@SuppressWarnings("unchecked")
public List<Article> search(String word) {
analyzer = new StandardAnalyzer(Version.LUCENE_36);
FullTextSession fullTextSession = Search.getFullTextSession(getCurrentSession());
// get a query builder
QueryBuilder queryBuilder = fullTextSession.getSearchFactory()
.buildQueryBuilder().forEntity(Article.class).get();
// build the query
org.apache.lucene.search.Query query = queryBuilder.keyword().
onFields("artTitle","artContent")
.matching(word).createQuery();
FullTextQuery fullTextQuery = fullTextSession.createFullTextQuery(query, Article.class);
// wrap Lucene query in a javax.persistence.Query
// org.hibernate.Query fullTextQuery = fullTextSession.createFullTextQuery(query, Article.class);
List<Article> searchResultList = fullTextQuery.list();
for (int i=0; i<searchResultList.size(); i++){
System.out.println("searchResultList###################"+searchResultList.get(i).getArtTitle());
}
Highlighter highlighter = new Highlighter( new QueryScorer( query ) );
highlighter.setTextFragmenter( new SimpleFragmenter( 20 ) );
int maxNumFragmentsRequired = 3;
for(Article art: searchResultList){
String artContent = art.getArtContent();
String artTitle = art.getArtTitle();
TokenStream tokenStream1 =
analyzer.tokenStream( "artContent", new StringReader( artContent ) );
TokenStream tokenStream2 =
analyzer.tokenStream( "artTitle", new StringReader( artTitle ) );
String result=null;
String resul2=null;
try {
result = highlighter.getBestFragments( tokenStream1, artContent, maxNumFragmentsRequired, " ..." );
resul2 = highlighter.getBestFragments( tokenStream2, artTitle, maxNumFragmentsRequired, " ..." );
} catch (IOException e) {
// TODO Auto-generated catch block
System.out.println("((((((((((((((((((((IOException))))))))))))))))))))"+e);
e.printStackTrace();
} catch (InvalidTokenOffsetsException e) {
// TODO Auto-generated catch block
System.out.println("((((((((((((((((((((InvalidTokenOffsetsException))))))))))))))))))))"+e);
e.printStackTrace();
}
System.out.println( result );
System.out.println( resul2 );
}
// fullTextSession.close();
return searchResultList;
}
我得到的结果是:
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is java.lang.IllegalStateException: No match found
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:973)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
com.github.dandelion.datatables.core.web.filter.DatatablesFilter.doFilter(DatatablesFilter.java:73)
root cause
java.lang.IllegalStateException: No match found
java.util.regex.Matcher.group(Matcher.java:485)
java.util.regex.Matcher.group(Matcher.java:445)
com.kefet.dao.impl.SearchDAOImpl.search(SearchDAOImpl.java:125)
com.kefet.service.impl.SearchServiceImpl.search(SearchServiceImpl.java:47)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:98)
org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:262)
org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:95)
org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207)
com.sun.proxy.$Proxy48.search(Unknown Source)
com.kefet.controller.SearchController.searchText(SearchController.java:30)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:606)
org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:215)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:689)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:938)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:870)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
com.github.dandelion.datatables.core.web.filter.DatatablesFilter.doFilter(DatatablesFilter.java:73)
我找到的教程位于下面的链接中:
我的 pom 文件包含以下内容:
<hibernate.version>4.3.5.Final</hibernate.version>
<hibernate-search-orm.version>4.5.1.Final</hibernate-search-orm.version>
<hibernate-search-analyzers.version>4.5.1.Final</hibernate-search-analyzers.version>
<hibernate-search-infinispan.version>4.5.1.Final</hibernate-search-infinispan.version>
<lucene-highlighter.version>4.9.0</lucene-highlighter.version>
<lucene-analyzers-common.version>4.9.0</lucene-analyzers-common.version>
<mysql.connector.version>5.1.30</mysql.connector.version>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search-orm</artifactId>
<version>${hibernate-search-orm.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search-analyzers</artifactId>
<version>${hibernate-search-analyzers.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-search-infinispan</artifactId>
<version>${hibernate-search-infinispan.version}</version>
</dependency>
<dependency>
<groupId>org.apache.lucene</groupId>
<artifactId>lucene-highlighter</artifactId>
<version>${lucene-highlighter.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<dependency>
提前谢谢
最佳答案
我不知道如何使用 token 流来做到这一点,但这是过去 3 小时对 hibernate 搜索进行一些黑客攻击的结果。它确实需要黑客才能执行简单的任务。该解决方案最终适用于 HS 4.5.1 和 Lucene 3.6.2(IBaseEntity 是带有 id 的“某物”):
public static final String HIGHLIGHTER_PRE = "<span class='search-found'>";
public static final String HIGHLIGHTER_POST = "</span>";
protected static DocumentBuilderIndexedEntity getDocumentBuilder(Session session, Class clazz) {
FullTextSession fullTextSession = Search.getFullTextSession(session);
SearchFactoryImplementor searchFactoryImplementor =
(SearchFactoryImplementor) fullTextSession.getSearchFactory();
EntityIndexBinding entityIndexBinding = searchFactoryImplementor.getIndexBinding(clazz);
return entityIndexBinding.getDocumentBuilder();
}
/**
* Provides lucene document for given entity.
*/
@SuppressWarnings("unchecked")
public static Document getDocument(Session session, IBaseEntity o, Class clazz) {
return getDocumentBuilder(session, clazz).getDocument(o, o.getId(), new HashMap<String, String>(),
new HibernateSessionLoadingInitializer((SessionImplementor) session),
new ContextualExceptionBridgeHelper());
}
/**
* Provides lucene analyzer for given entity.
*/
public static Analyzer getAnalyzer(Session session, Class clazz) {
return getDocumentBuilder(session, clazz).getAnalyzer();
}
/**
* @param luceneQuery You have it before you create {@link FullTextQuery} from {@link FullTextSession}.
*/
public static Highlighter getHighlighter(Query luceneQuery) {
Highlighter highlighter = new Highlighter(new SimpleHTMLFormatter(HIGHLIGHTER_PRE, HIGHLIGHTER_POST),
new QueryScorer(luceneQuery));
highlighter.setTextFragmenter(new SimpleFragmenter());
return highlighter;
}
/**
* Returns entity raw lucene text content without any analyzer usage (ie. even with HTML tags).
*/
public static String getFullTextContent(Session session, IBaseEntity o) {
if (o==null)
return "";
Set<String> strings = new LinkedHashSet<String>(); // to avoid multiple same strings
Document document = getDocument(session, o, o.getClass());
List<org.apache.lucene.document.Field> fields = new ArrayList<org.apache.lucene.document.Field>();
// here is the part where we should add fields by name to text content (manually as well)
for (String fieldName : listIndexedFields(o.getClass()))
fields.addAll(Arrays.asList(document.getField(fieldName)));
for (org.apache.lucene.document.Field field: fields) {
if (field!=null) {
String s = field.stringValue();
if (!StringUtils.isBlank(s))
strings.add(s);
}
}
if (strings.isEmpty())
return "";
StringBuilder sb = new StringBuilder();
for (String s: strings) {
if (sb.length()>0)
sb.append(" ");
sb.append(s);
}
return sb.toString();
}
/**
* @return Lucene highlighter text for search results for given object.
*/
public static String getHighlighterText(Session session, IBaseEntity o, Query query) {
Analyzer analyzer = getAnalyzer(session, o.getClass());
Highlighter highlighter = getHighlighter(query);
return getHighlightedText(analyzer, highlighter, getFullTextContent(session, o));
}
public static String getHighlightedText(Analyzer analyzer, Highlighter highlighter, String fullTextContent) {
try {
return highlighter.getBestFragment(analyzer, null, fullTextContent);
} catch (Exception e) {
throw new RuntimeException("Cannot highlight lucene results", e);
}
}
关于java - 如何使用 Lucene、Highlighter 和 StandardAnalyzer 通过 Hibernate 搜索引擎获取文本片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24975599/
任何人都可以帮我列出一个很好的 php 站点搜索引擎列表。我正在考虑实现谷歌站点搜索,但我宁愿不为此付费,而且我宁愿尽可能多地控制它。 最佳答案 通读Roll your own Search Engi
我正在使用 Laravel 为移动应用程序构建 REST api。现在我需要一个搜索引擎。 首先,我从未使用过任何搜索引擎。所以我正在寻找一个易于使用但仍然擅长全文搜索和过滤“where”的工具 我要
我正在建立一个公司网站。我们正在寻找任何基于 ASP.NET 的开源或付费搜索引擎。应该可以 搜索网站中所有页面的网页内容。 所有办公文件。等等 如果我们有一些基于用户类型和风格的搜索结果过滤。 请让
目前我正在尝试为我的网站创建一个搜索功能,允许用户使用他们的全名(名字或姓氏)或他们的用户名搜索其他用户。现在我已经创建了一个临时搜索,它使用 mysql 的 LIKE 功能和 %name% 来允许通
我正在尝试制作一个搜索引擎,但我遇到了这个错误 Notice: Undefined variable: construct in C:\xampp\htdocs\test\search.php on
我有这个“搜索”选项,它在其中查找表格所请求变量的标题和类别。 //This could be Reference or Product Name $name = mysqli_real_escape
你好 php 的另一个问题,我不确定为什么它不起作用,但这是代码: $keyword){ $where .="`keywords` LIKE '%$keyword%'";
我已经在空闲时间学习 PHP 几个星期了,这是我不得不寻求帮助的第一个问题。我在整个 Internet 上进行了搜索,但在使用具有两个输入字段的 PHP mysql 搜索引擎时,没有发现任何我能完全理
我正在尝试在关键术语表和页面之间进行搜索查询。 考虑下表。 页数 page_id page_name1 cats2 dogs3 humans 关键词 key
我正在尝试使用html ajax和jsp进行与google搜索相同的搜索引擎 1.当我在文本框中点击一个字符时,每次点击都会调用ajax 2.ajax 将其重定向到 jsp,其中我有一个简单的查询,该
我已经阅读了一些关于内置 python 附带的 re 模块的文档,但我似乎无法理解它。事实上,我不确定这就是我要找的东西,所以让我解释一下: 我有一本大字典。我想要的是能够输入搜索条件,例如 hell
我有一个包含多个对象的网络应用程序,其中有多个我想要搜索的String。我想按最佳“匹配”对“匹配”进行排序。示例:搜索“stackoverflow is Great”。 “Stackoverflow
我有一个新创建的 Web 应用程序托管在 AppEngine 中(仅 HTML)问题是,我怎样才能让这个页面出现在谷歌搜索引擎上?这类似于常规方法(robot.txt 等)吗? 谢谢! 最佳答案 只需
我想要一个只搜索我自己站点的搜索引擎。我目前有一些 JavaScript,但它只搜索特定页面上的单词。如果可能的话,我需要它来搜索我网站内的链接。 我无法使用 Google 搜索引擎,因为我的站点位于
目前,我有一个汽车品牌列表(本田,丰田,宝马,梅赛德斯·奔驰等)的表格(car_brands),并且我有一个标题,用户可以输入,例如mercedes benz e 230,所以我想输入用户可以通过搜索
我将在我的应用程序中使用 ElasticSearch 作为搜索存储库。我有一些关于组织方面的最佳实践的问题当对象彼此具有关联/关系时,搜索索引中的对象。 据我所知,搜索索引是一个平面结构,不符合以下概
基本要求: 应该能够索引 MediaWiki、Confluence、Sharepoint、GitHub:Enterprise、Askbot 等内容 应该相当聪明地去除重复结果(Confluence 搜
所以,我才刚刚开始阅读这方面的内容,我以前从未在 PHP 中实现过搜索。我想知道几个问题: 听起来,Sphinx 需要一个“守护进程”,一个运行在后台,操作? 假设我建立了一个 mySQL 的索引表,
我有一个包含 20 个文本文件的文件夹。我希望索引这个文件夹并在这些文件中搜索任何关键字。 我如何在 C# 中执行此操作? 最佳答案 这是对 lucene.Net 的一个很好的介绍: Introduc
我正在寻找可用于在我的网站上搜索内容的任何 javascript 库,我遇到了一些安静的但大多数它们需要使用数据库来存储索引以优化搜索查询,但我只需要一个内置javascript的数据库免费搜索引擎。
我是一名优秀的程序员,十分优秀!