相关文章推荐
从容的墨镜  ·  android kotlin 计时器-掘金·  1 年前    · 
狂野的日光灯  ·  openlayers ...·  1 年前    · 

Solr通常被称为搜索服务器,我们可以在实现全文搜索功能时使用它。 但是,当我们实现从搜索表单获取其输入的搜索功能时,利用Solr的性能通常是明智的。

在这种情况下,执行的搜索查询取决于收到的输入。 这意味着查询参数的数量取决于输入到搜索表单的输入。 换句话说,执行的搜索查询是动态的。

我的Spring Data Solr教程 前一部分 教我们如何将自定义方法添加到单个存储库。 现在该使用这些信息并了解如何使用Spring Data Solr创建动态查询。 让我们开始吧。

注意: 这些博客条目提供了其他信息,可以帮助我们理解此博客文章中描述的概念:

创建动态查询

本节描述了如何使用Spring Data Solr创建动态查询。 它分为两个小节,如下所述:

  • 第一部分描述了在开始实际搜索功能之前需要了解的基础知识。
  • 第二部分描述了如何通过向Spring Data Solr存储库添加自定义方法来实现示例应用程序的搜索功能。

在开始实现示例应用程序的搜索功能之前,我们需要知道如何使用Spring Data Solr“手动”创建查询。 我们可以按照以下步骤“手动”创建查询:

  1. 创建搜索条件。
  2. 创建查询,其中包含使用的搜索条件。
  3. 执行创建的查询。

下面将更详细地描述这些步骤。

创建搜索条件

首先,我们必须为查询创建搜索条件。 我们可以使用以下描述的条件类来做到这一点:

创建执行的查询

其次,我们必须创建执行的查询。 下面介绍Spring Data Solr的查询类:

执行创建的查询

第三,我们必须执行创建的查询。 SolrTemplate 类实现了一些可用于此目的的方法。 下面介绍了这些方法:

  • long count(最终SolrDataQuery查询) 方法返回使用作为方法参数给出的查询找到的文档数。
  • UpdateResponse delete(SolrDataQuery query) 方法删除与作为方法参数给出的查询匹配的文档,并返回一个 UpdateResponse 对象。
  • T queryForObject(Query query,Class <T> clazz) 方法返回与作为方法参数给出的查询匹配的单个文档。
  • FacetPage <T> queryForFacetPage(FacetQuery query,Class <T> clazz) 方法针对Solr索引执行构面查询,并将查询结果作为 FacetPage 对象返回。
  • Page <T> queryForPage(Query query,Class <T> clazz) 方法对Solr索引执行查询,并作为 Page 接口的实现返回查询结果。

让我们继续实践该理论。

实现搜索功能

我们的搜索功能的要求如下:

  • 搜索功能必须返回名称或描述包含给定搜索词的某些单词的所有待办事项。 换句话说,如果搜索词是“ Foo Bar”,则我们的搜索功能必须返回标题或描述包含“ Foo”或“ Bar”的待办事项条目。
  • 搜索必须不区分大小写。

因为我们的搜索功能不是静态的,所以我们必须使用动态查询来创建它。 我们可以通过在Spring Data Solr存储库中添加自定义方法来使用Spring Data Solr创建动态查询。 换句话说,我们必须遵循以下步骤:

  1. 创建一个自定义接口,该接口声明添加的方法。
  2. 实现创建的接口。
  3. 修改存储库接口以扩展创建的接口。

下面将更详细地描述这些步骤。

创建自定义界面

首先,我们必须创建一个自定义接口,该接口声明我们的自定义搜索方法。 我们可以按照以下步骤进行操作:

  1. 创建一个名为 CustomTodoDocumentRepository 的接口。
  2. 声明 search() 方法。 此方法将使用的搜索词作为方法参数,并返回 TodoDocument 对象的列表。

CustomTodoDocumentRepository 接口的源代码如下所示:

public interface CustomTodoDocumentRepository {
    public List<TodoDocument> search(String searchTerm);
    //Other methods are omitted.
 

实施创建的接口

其次,我们必须实现我们之前创建的自定义接口。 我们可以按照以下步骤进行操作:

  1. 创建一个名为TodoDocumentRepositoryImpl的类,并实现CustomTodoDocumentRepository接口。
  2. @Repository批注对类进行批注。
  3. SolrTemplate字段添加到类中,并使用@Resource注释对其进行注释。
  4. 实现search()方法。

search()方法的实现需要在此给出更详细的描述。 我们可以通过执行以下步骤来实现search()方法:

  1. 获取搜索词的单词。
  2. 通过调用私有createSearchConditions()方法并将搜索词的单词作为方法参数来构造使用的搜索条件。 此方法通过使用Criteria类的API创建使用的搜索条件。
  3. 通过创建新的SimpleQuery对象来创建执行的查询,并将创建的Criteria对象作为构造函数参数传递。
  4. 通过调用SolrTemplate类的queryForPage()方法获取搜索结果。 将创建的查询和预期结果对象的类型作为方法参数传递。
  5. 通过调用Page接口的getContent()方法来返回搜索结果。

TodoDocumentRepositoryImpl类的源代码如下所示:

import org.springframework.data.domain.Page;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.Criteria;
import org.springframework.data.solr.core.query.SimpleQuery;
import org.springframework.stereotype.Repository;
import javax.annotation.Resource;
@Repository
public class TodoDocumentRepositoryImpl implements CustomTodoDocumentRepository {
    @Resource
    private SolrTemplate solrTemplate;
    @Override
    public List<TodoDocument> search(String searchTerm) {
        String[] words = searchTerm.split(" ");
        Criteria conditions = createSearchConditions(words);
        SimpleQuery search = new SimpleQuery(conditions);
        Page results = solrTemplate.queryForPage(search, TodoDocument.class);
        return results.getContent();
    private Criteria createSearchConditions(String[] words) {
        Criteria conditions = null;
        for (String word: words) {
            if (conditions == null) {
                conditions = new Criteria(“title”).contains(word)
                        .or(new Criteria(“description”).contains(word));
            else {
                conditions = conditions.or(new Criteria(“title”).contains(word))
                        .or(new Criteria(“description”).contains(word));
        return conditions;
    //Other methods are omitted
 

修改存储库界面

第三,我们必须使我们的自定义search()方法对存储库的用户可见。 我们可以通过扩展CustomTodoDocumentRepository接口来实现。 TodoDocumentRepository接口的源代码如下所示:

import org.springframework.data.solr.repository.SolrCrudRepository;
public interface TodoDocumentRepository extends CustomTodoDocumentRepository, SolrCrudRepository<TodoDocument, String> {
 

现在,我们向Spring Data Solr存储库添加了一个自定义search()方法。 让我们找出如何使用此方法。

使用自定义方法

我们可以通过修改RepositoryTodoIndexService类的search()方法来使用自定义方法。 此方法的新实现非常简单。 它通过调用我们的Spring Data Solr存储库的search()方法获取搜索结果,并返回搜索结果。

RepositoryTodoIndexService类的源代码如下所示:

import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
@Service
public class RepositoryTodoIndexService implements TodoIndexService {
    @Resource
    private TodoDocumentRepository repository;
    //Other methods are omitted.
    @Override
    public List<TodoDocument> search(String searchTerm) {
        return repository.search(searchTerm);
 

现在,我们已经使用Spring Data Solr实现了动态搜索功能。 尽管我们的搜索功能非常简单,但是我们现在也应该能够实现更复杂的查询。

本教程教了我们两件事:

  • 我们学习了如何使用Spring Data Solr“手动”创建查询。
  • 我们了解到,必须通过向单个存储库添加自定义方法来实现动态搜索方法。

我的Spring Data Solr教程的下一部分描述了如何对查询结果进行排序。

PS此博客文章的示例应用程序可在Github上获得

参考: Spring Data Solr教程: Petri Kainulainen博客上来自我们JCG合作伙伴 Petri Kainulainen的动态查询

翻译自: https://www.javacodegeeks.com/2013/05/spring-data-solr-tutorial-dynamic-queries.html

Solr通常被称为搜索服务器,我们可以在实现全文搜索功能时使用它。 但是,当我们实现从搜索表单获取其输入的搜索功能时,利用Solr的性能通常是明智的。 在这种情况下,执行的搜索查询取决于收到的输入。 这意味着查询参数的数量取决于输入到搜索表单的输入。 换句话说,执行的搜索查询是动态的。 我的Spring Data Solr教程的前一部分教我们如何将自定义方法添加到单个存储库。 现在该...
Apache SolrSpring数据 该项目将要移至 ,不建议用于新项目。 作为Spring数据版本2020.0的一部分,最后一个版本(4.3.0)将在2022年中之前查看补丁更新。 项目的主要目标是使使用新数据访问技术(例如非关系数据库,map-reduce框架和基于云的数据服务)的使用Spring支持的应用程序更容易构建。 用于Apache SolrSpring Data项目提供了与搜索引擎的集成 提供自己的可扩展MappingSolrConverter作为DocumentObjectBinder替代品,Apache Solr可以使用Spring Data处理继承以及自定义类型(如Point或DateTime用法 具有多核支持的高级存储库抽象 增强,方面和突出显示的注释 可自定义的类型映射和类型转换 Solr模板支持流利的查询API 异常转换为Spring的可
该演示项目涵盖了Spring Data Solr项目的基本功能。 演示演示的幻灯片位于 该演示项目包括基于Spring-Data-Solr的各种技术。 Earch模块包括集成测试以了解实现。 通用模块包含演示项目的基本组件。 嵌入式Solr服务器 Solr资料库 Solr模板用法 剩余数据模块包含一个示例Spring-Boot应用程序,该应用程序结合了Spring-Data-SolrSpring-Data-Rest。 jaxrs模块包含一个带有多个服务层的Spring-Boot应用程序。 服务层公开了JaxRS 2接口。 该服务使用Jersey作为实现。 星巴克模块包含一个Spring Boot Web应用程序,该应用程序提供了通过用户界面使用搜索实现的功能。 1.1 什么是Solr   大多数搜索引擎应用都必须具有某种搜索功能,问题是搜索功能往往是巨大的资源消耗并且它们由于沉重的数据库加载而拖垮你的应用的性能。   这就是为什么转移负载到一个外部的搜索服务器是一个不错的主意,Apache Solr是一个流行的开源搜索服务器,它通过使用类似REST的HTTP API,这就确保你能从几乎任何编程语言来使用solr。   Solr是一个...
业务场景,并不是我们业务的所有字段都需要在schema.xml、managed-schema指定成固定的字段。 、这些都是固定的 例如我现在有一个新业务,大概有5个字段,需要拼接在原来的core里面,那么dynamicField就发挥了它的用武之地了。 直接上代码: schema.xml、managed-schema文件中的配置如下        存放String类型
Solr的下载安装教程如下: 1. 首先,你需要下载最新版本的Solr。你可以在Solr的官方网站上找到下载地址:http://lucene.apache.org/solr/。选择合适的版本进行下载。 2. 下载完成后,将Solr解压到你想要安装的位置。解压后,你会看到两个重要的文件:解压目录下的/dist/apache-solr-1.4.0.war和解压目录下的/example/solr。确保solr目录下有以下文件存在:solr/conf/solrconfig.xml、solr/conf/schema.xml和solr/data。 3. 将解压后的dist/apache-solr-1.4.0.war文件复制到你的Tomcat的webapps目录下,并将其重命名为solr14.war(你可以自定义名称)。 4. 将example/solr目录复制到Tomcat的根目录下或者其他你想要放置的位置,并记录下该目录的地址。比如,我将其放在C:根目录下的"c:/solr/"。 5. 启动Tomcat服务器。Tomcat会自动解压solr14.war文件。此时可能会出现错误提示,不用担心,只需检查Tomcat是否成功启动。 6. 访问http://localhost:8504/solr14(根据你的Tomcat配置可能会有所不同),你会看到一个"HTTP Status 500 - Severe errors in solr configuration."的错误页面。 7. 打开Tomcat的webapps目录下的solr14/WEB-INF/web.xml文件。找到被注释掉的内容,并修改value的值如下所示: <env-entry> <env-entry-name>solr/home</env-entry-name> <env-entry-value>C:\solr</env-entry-value> <env-entry-type>java.lang.String</env-entry-type> </env-entry> 注意,solr/home的值就是solr的conf和data目录所在的位置。 8. 保存并关闭web.xml文件。 9. 现在再次访问"http://localhost:8504/solr14/",你应该能看到"Welcome to Solr!"的欢迎页面。 10. 恭喜你,Solr安装成功了!现在你可以开始使用Solr进行搜索和索引了。[1] Solr是一个强大的搜索平台,它不仅可以将结构化数据转换为结构化数据后导入数据,还可以从其他数据源导入数据。虽然Solr类似于数据库,但它具有一些独特的特性和优势。例如,Solr可以与Hadoop配合使用,以实现更大规模的数据处理和分析。此外,Solr还可以与Hive等工具配合使用,以提供更丰富的功能和灵活性。因此,Solr在某些场景下比传统数据库更适合使用。[2] 请注意,上述引用中提到的Solr版本为1.4,但实际上已经有更高版本的Solr可供下载和使用。请根据你的需求选择合适的版本进行安装。[1]