精华内容
下载资源
问答
  • 使用solr 检索word文档

    千次阅读 2019-06-27 10:06:02
    版权声明:本文为博主原创文章,转载注明出处即可。...Solr是Apache的顶级开源项目,使用java开发 ,基于Lucene的全文检索服务器。 Solr比Lucene提供了更多的查询语句,而且它可扩展、可配置,同时它...

    版权声明:本文为博主原创文章,转载注明出处即可。 https://blog.csdn.net/bskfnvjtlyzmv867/article/details/80940089

    I. Solr

    Solr简介

    Solr是Apache的顶级开源项目,使用java开发 ,基于Lucene的全文检索服务器。 Solr比Lucene提供了更多的查询语句,而且它可扩展、可配置,同时它对Lucene的性能进行了优化。

    Solr的全文检索流程

    • 索引流程: Solr客户端(浏览器、java程序)可以向Solr服务端发送POST请求,请求内容是包含Field等信息的一个xml文档,通过该文档,Solr实现对索引的维护(增删改)。
    • 搜索流程: Solr客户端(浏览器、java程序)可以向Solr服务端发送GET请求,Solr服务器返回一个xml文档。

    Solr同样没有视图渲染的功能。

    与Lucence区别

    Lucene是一个全文检索引擎工具包,它只是一个jar包,不能独立运行,对外提供服务。

    Solr是一个全文检索服务器,它可以单独运行在servlet容器,可以单独对外提供搜索和索引功能。Solr比Lucene在开发全文检索功能时,更快捷、更方便。

    II. Solr安装配置

    环境依赖

    Solr目录结构

    这里选择的是Windows平台的软件包,Solr7.4.0解压目录如下:

    • bin:包括一些使用Solr的重要脚本 
      <ul><li>solr和solr.cmd:分别用于Linux和Windows系统,根据所选参数不同而控制Solr的启动和停止</li>
      	<li>post:提供了一个用于发布内容的命令行接口工具。支持导入JSON,XML和CSV,也可以导入HTML,PDF,Microsoft Office格式(如MS Word),纯文本等等。</li>
      	<li>solr.in.sh和solr.in.cmd:分别用于Linux和Windows系统的属性文件</li>
      	<li>install_solr_services.sh:用于Linux系统将Solr作为服务安装</li>
      </ul></li>
      <li><strong>contrib</strong>:包含一些solr的一些插件或扩展&nbsp;
      <ul><li>analysis-extras: 包含一些文本分析组件及其依赖</li>
      	<li>clustering:包含一个用于集群搜索结果的引擎</li>
      	<li>dataimporthandler:把数据从数据库或其它数据源导入到solr</li>
      	<li>extraction:整合了Apache Tika,Tika是用于解析一些富文本(诸如Word,PDF)的框架</li>
      	<li>langid:检测将要索引的数据的语言</li>
      	<li>map-reduce:包含一些工具用于Solr和Hadoop Map Reduce协同工作</li>
      	<li>morphlines-core:包含Kite Morphlines,它用于构建、改变基于Hadoop进行ETL(extract、transfer、load)的流式处理程序</li>
      	<li>uima:包含用于整合Apache UIMA(文本元数据提取的框架)类库</li>
      	<li>velocity:包含基于Velocity模板的简单的搜索UI框架</li>
      </ul></li>
      <li><strong>dist</strong>:包含主要的Solr的jar文件</li>
      <li><strong>docs</strong>:文档</li>
      <li><strong>example</strong>:包含一些展示solr功能的例子&nbsp;
      <ul><li>exampledocs:这是一系列简单的CSV,XML和JSON文件,可以bin/post在首次使用Solr时使用</li>
      	<li>example-DIH:此目录包含一些DataImport Handler(DIH)示例,可帮助您开始在数据库,电子邮件服务器甚至Atom订阅源中导入结构化内容。每个示例将索引不同的数据集</li>
      	<li>files:该files目录为您可能在本地存储的文档(例如Word或PDF)提供基本的搜索UI</li>
      	<li>films:该films目录包含一组关于电影的强大数据,包括三种格式:CSV,XML和JSON</li>
      </ul></li>
      <li><strong>licenses</strong>:包含所有的solr所用到的第三方库的许可证</li>
      <li><strong>server</strong>:solr应用程序的核心,包含了运行Solr实例而安装好的Jetty servlet容器。&nbsp;
      <ul><li>contexts:这个文件包含了solr Web应用程序的Jetty Web应用的部署的配置文件</li>
      	<li>etc:主要就是一些Jetty的配置文件和示例SSL密钥库</li>
      	<li>lib:Jetty和其他第三方的jar包</li>
      	<li>logs:Solr的日志文件</li>
      	<li>resources:Jetty-logging和log4j的属性配置文件</li>
      	<li>solr:新建的core或Collection的默认保存目录,里面必须要包含solr.xml文件</li>
      	<li>configsets:包含solr的配置文件</li>
      	<li>solr-webapp:包含solr服务器使用的文件;不要在此目录中编辑文件(solr不是JavaWeb应用程序)</li>
      </ul></li>
      

    Solr的启动和关闭

    启动:cmd进入bin目录后

    solr start

    启动完成即可访问:http://localhost:8983/solr/

    关闭Solr需要指定端口:

    solr stop -p 8983

    创建Solr Core

    两种方法:

    1. 通过dos命令创建,进入bin目录,输入:solr create -c corename

      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706133733535"></p>
      
      <p>使用该命令会在/server/solr下就会出现新的文件夹corename(就是新创建的core)。</p>
      
      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706133802412"></p>
      </li>
      <li>
      <p>直接在/server/solr下创建新文件夹,自定义文件夹名称作为新的core。将/server/solr/configsets/_default目录下的conf文件夹,然后拷贝一份至自定义文件夹目录。</p>
      
      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706133916921"></p>
      
      <p>打开Solr面板,按照图中指示操作则可以添加新创建的collection2的Solr Core。</p>
      
      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706133940462"></p>
      
      <p><img alt="" class="has" src="https://img-blog.csdn.net/2018070613401297"></p>
      </li>
      

    III. Solr面板

    基础面板

    • Dashboard

      <p>仪表盘,显示了该Solr实例开始启动运行的时间、版本、系统资源、jvm等信息。</p>
      </li>
      <li>
      <p>Logging</p>
      
      <p>Solr运行日志信息。</p>
      </li>
      <li>
      <p>Cloud</p>
      
      <p>Cloud即SolrCloud,即Solr云(集群),当使用Solr Cloud模式运行时会显示此菜单。</p>
      </li>
      <li>
      <p>Core Admin</p>
      
      <p>Solr Core的管理界面,在这里可以添加SolrCore实例。</p>
      </li>
      <li>
      <p>Java Properties</p>
      
      <p>Solr在JVM 运行环境中的属性信息,包括类路径、文件编码、jvm内存设置等信息。</p>
      </li>
      <li>
      <p>Tread Dump</p>
      
      <p>显示Solr Server中当前活跃线程信息,同时也可以跟踪线程运行栈信息。</p>
      </li>
      <li>
      <p>Core Selector</p>
      
      <p>选择一个SolrCore进行详细操作。</p>
      </li>
      

    Core Selector

    • Analysis

      <p>通过Analysis界面可以测试索引分析器和搜索分析器的执行情况。在Solr中,<strong>分析器是绑定在域的类型中的</strong>。</p>
      
      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706134110790"></p>
      </li>
      <li>
      <p>Dataimport</p>
      
      <p>可以定义数据导入处理器,从关系数据库将数据导入到Solr索引库中。默认没有配置,需要手工配置。</p>
      </li>
      <li>
      <p>Documents</p>
      
      <p>通过/update表示更新索引,<strong>Solr默认根据id(唯一约束)域来更新Document的内容,如果根据id值搜索不到id域则会执行添加操作,如果找到则更新</strong>。</p>
      
      <p>通过此菜单可以<strong>创建索引、更新索引、删除索引</strong>等操作。</p>
      
      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706134226164"></p>
      </li>
      <li>
      <p>Query</p>
      
      <p>通过/select执行搜索索引,必须指定“q”查询条件方可搜索。</p>
      
      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706134305219"></p>
      </li>
      

    IV. Solr的基本使用

    在新建的slor core的conf文件夹里,存在重要的配置文件。

    • managed-schema:主要定义了索引数据类型,索引字段等信息。旧版的schema.xml文件。
    • solrconfig.xml:主要定义了Solr的一些处理规则,包括索引数据的存放位置,更新,删除,查询的一些规则配置。

    V. managed-schema

    field

    <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />

    Field节点指定建立索引和查询数据的字段。

    • name:指定域的名称
    • type:指定域的类型
    • indexed:是否索引
    • stored:是否存储
    • required:是否必须
    • multiValued:是否多值,比如商品信息中,一个商品有多张图片,一个Field想存储多个值的话,必须将multiValued设置为true

    dynamicField

    <dynamicField name="*_i"  type="pint" indexed="true"  stored="true"/>

    dynamicField 表示动态字段,可以动态定义一个字段,只要符合规则的字段都可以。

    • name:指定动态域的命名规则,*_i只要以_i结尾的字段都满足这个定义。

    • type:指定域的类型

    • indexed:是否索引
    • stored:是否存储

    uniqueKey

    <uniqueKey>id</uniqueKey>

    指定唯一键。其中的id是在Field标签中已经定义好的域名,而且该域要设置为required为true。 一个managed-schema文件中必须有且仅有一个唯一键

    copyField

    <copyField source="cat" dest="_text_"/>

    通过copyField,可以把一个字段的值复制到另一个字段中,也可以把多个字段的值同时复制到另一个字段中,这样搜索的时候都可以根据一个字段来进行搜索。

    • source:要复制的源Field域的域名
    • dest:目标Field域的域名
    • 由dest指的的目标Field域,必须设置multiValued为true。

    fieldType

    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
    </fieldType>
    

    fieldType节点主要用来定义域的类型。

    • name:指定域类型的名称
    • class:指定该域类型对应的solr的类型
    • analyzer:指定分析器
    • type:index、query,分别指定搜索和索引时的分析器
    • tokenizer:指定分词器
    • filter:指定过滤器
    • positionIncrementGap:可选属性,定义在同一个文档中此类型数据的空白间隔,避免短语匹配错误

    VI. solrconfig.xml

    datadir

    <dataDir>${solr.data.dir:}</dataDir>

    每个SolrCore都有自己的索引文件目录 ,默认在SolrCore目录下的data中。

    luceneMatchVersion

    <luceneMatchVersion>7.4.0</luceneMatchVersion>

    表示solr底层使用的是Lucene7.4.0版本

    lib

    <lib dir="${solr.install.dir:../../../..}/contrib/extraction/lib" regex=".*\.jar" />

    表示Solr引用包的位置,当dir对应的目录不存在时候,会忽略此属性。

    solr.install.dir:表示solrcore的安装目录。

    requestHandler

    <requestHandler name="/query" class="solr.SearchHandler">
        <lst name="defaults">
            <str name="echoParams">explicit</str>
            <str name="wt">json</str>
            <str name="indent">true</str>
        </lst>
    </requestHandler>

    requestHandler请求处理器,定义了索引和搜索的访问方式。 通过/update维护索引,可以完成索引的添加、修改、删除操作;通过/select搜索索引。

    设置搜索参数完成搜索,搜索参数也可以设置一些默认值,如下

    directoryFactory

    <directoryFactory name="DirectoryFactory"
                        class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}"/>

    定义索引的存储方案,共有以下存储方案:

    • solr.StandardDirectoryFactory——这是一个基于文件系统存储目录的工厂,它会试图选择最好的实现基于你当前的操作系统和Java虚拟机版本。
    • solr.SimpleFSDirectoryFactory——适用于小型应用程序,不支持大数据和多线程。
    • solr.NIOFSDirectoryFactory——适用于多线程环境,但是不适用在windows平台(很慢),是因为JVM还存在bug。
    • solr.MMapDirectoryFactory——这个是solr3.1到4.0版本在linux64位系统下默认的实现。它是通过使用虚拟内存和内核特性调用mmap去访问存储在磁盘中的索引文件。它允许lucene或solr直接访问I/O缓存。如果不需要近实时搜索功能,使用此工厂是个不错的方案。
    • solr.NRTCachingDirectoryFactory——此工厂设计目的是存储部分索引在内存中,从而加快了近实时搜索的速度。
    • solr.RAMDirectoryFactory——这是一个内存存储方案,不能持久化存储,在系统重启或服务器crash时数据会丢失。且不支持索引复制。

    VII. Solr发布至Tomcat

    从Solr5.0.0版本开始,Solr不提供可供直接发布的war包,需要我们自己重新整合。

    在将Solr发布至Tomcat之前,我们需要了解solrhome和solrcore的概念。

    • solrhome:solrhome是solr服务运行的主目录,一个solrhome目录里面包含多个solrcore目录 ;
    • solrcore:solrcore目录里面了一个solr实例运行时所需要的配置文件和数据文件,每一个solrcore都可以单独对外提供搜索和索引服务,多个solrcore之间没有关系;

    1530778599893

    下面进行将Solr发布到Tomcat8.5。

    拷贝工程文件夹

    1. 将 solr-7.1.0\server\solr-webapp 下的webapp复制到 tomcat\webapps,并改名为solr;

      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706134612533"></p>
      </li>
      <li>
      <p>定义我们的solr_home,这里定义在D:\Apache\apache-tomcat-8.5.11\solr_home位置;</p>
      
      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706134730876"></p>
      </li>
      <li>
      <p>将 solr-7.1.0 下的contrib和dist文件夹复制到指定的solrhome目录下;</p>
      
      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706134838846"></p>
      </li>
      <li>
      <p>将 solr-7.1.0\server\solr下的文件复制到solrhome目录下。</p>
      
      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706134922762"></p>
      </li>
      

    复制相关的jar包

    1. 将\server\lib\ext中所有的.jar文件复制到tomcat\webapps\solr\WEB-INF\lib中;

      <p><img alt="" class="has" src="https://img-blog.csdn.net/2018070613495565"></p>
      </li>
      <li>
      <p>将\server\lib下的metrics-*.jar复制到tomcat\webapps\solr-7.1.0\WEB-INF\lib中;</p>
      
      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706135017395"></p>
      </li>
      <li>
      <p>将\server\lib下的gmetric4j-1.0.7.jar复制到tomcat\webapps\solr-7.1.0\WEB-INF\lib中;</p>
      
      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706135035381"></p>
      </li>
      

    修改web.xml文件

    1. 配置solrhome;

      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706135131496"></p>
      </li>
      <li>
      <p>修改授权信息:找到标签,位置在文件最后,将的内容注释掉,大概意思就是开放solr权限。</p>
      
      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706135154972"></p>
      </li>
      

    日志配置

    1. 在tomcat\webapps\solr\WEB-INF目录下新建目录classes ,并将\server\resources下的log4j2.xml复制到新建的classes文件夹中;

      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706135234317"></p>
      </li>
      <li>
      <p>修改tomcat的bin目录下catalina.bat脚本,增加solr.log.dir系统变量,指定solr日志记录存放地址。</p>
      
      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706135312518"></p>
      </li>
      

    启动测试

    启动Tomcat,访问http://localhost:8080/solr/index.html

    VIII. 连接MySQL

    利用slor core的Dataimport面板可以将数据库中指定的sql语句的结果导入到solr索引库中。

    选定Core

    可以重新定义一个新的Core,也可以选择现有的core(这里选择collection1,并改名为tb_item)

    1. 在solrcore的conf目录下,有一个solrconfig.xml的配置文件,该配置文件用于配置solrcore的运行信息;

    2. 修改lib标签设置的路径;

      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706135428911"></p>
      
      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706135449326"></p>
      </li>
      

    导入依赖包

    1. 将mysql-connector-java-x.x.x.jar拷贝到…\solr_home\contrib\db下;

      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706135509283"></p>
      </li>
      <li>
      <p>查看…\solr_home\dist下有没有 solr-dataimporthandler-7.4.0.jar,如果没有则去下载的代码拷贝一份;</p>
      
      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706135545797"></p>
      </li>
      <li>
      <p>在solrconfig.xml中配置jar包的lib标签;</p>
      
      <pre class="has" name="code"><code class="hljs xml"><span class="hljs-comment">&lt;!-- 配置dataimport和mysql --&gt;</span>
      

    <lib dir="KaTeX parse error: Can't use function '\.' in math mode at position 112: …ljs-string">".*\̲.̲jar"</span> /&g…{solr.install.dir:…}/dist/" regex=“solr-dataimporthandler-7.4.0.jar” />

    <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706135626269"></p>
    </li>
    

    配置连接信息

    1. 找到选定的Core(tb_item)下的solrconfig.xml文件,在solrconfig.xml中,添加一个dataimport的requestHandler;

      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706135653420"></p>
      </li>
      <li>
      <p>在solrconfig.xml同一位置下创建data-config.xml 文件;</p>
      
      <p>对应的数据库商品表为:</p>
      
      <p><img alt="" class="has" src="https://img-blog.csdn.net/2018070613572746"></p>
      </li>
      

    配置Field域

    tb_item的表结构:

    在选定的Core(tb_item)的conf下,打开managed-schema文件,在其中定义Field域。Field域的name属性需要和data-config.xml 的一致。

    <!-- 配置商品表的Field -->
    <!-- 商品id -->
    <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
    <!-- 商品名称 -->
    <field name="title" type="string" indexed="true" stored="true" />
    <!-- 商品卖点 -->
    <field name="sellPoint" type="string" indexed="true" stored="true" />
    <!-- 商品条形码 -->
    <field name="barcode" type="string" indexed="true" stored="true" />
    <!-- 图片地址 -->
    <field name="image" type="string" indexed="false" stored="true" />
    <!-- 价格 -->
    <field name="price" type="string" indexed="false" stored="true" />
    <!-- 类别id -->
    <field name="cid" type="string" indexed="false" stored="true" />
    <!-- 数量 -->
    <field name="num" type="string" indexed="false" stored="true" />
    <!-- 状态 -->
    <field name="status" type="string" indexed="false" stored="true" />
    <!-- 创建时间 -->
    <field name="created" type="string" indexed="false" stored="true" />
    <!-- 更新时间 -->
    <field name="updated" type="string" indexed="false" stored="true" />
    
    <!-- 目标域 -->
    <field name="tb_item_keywords" type="string" indexed="true" stored="true" multiValued="true" />
    
    <!-- 将商品名称和卖点加入目标域 -->
    <copyField source="title" dest="tb_item_keywords" />
    <copyField source="sellPoint" dest="tb_item_keywords" />

    启动测试

    1. 重启Tomcat,打开Solr的Dataimport面板;

      <p><img alt="" class="has" src="https://img-blog.csdn.net/20180706135830359"></p>
      </li>
      <li>
      <p>选择entity,点击Execute执行。</p>
      
      <p><img alt="" class="has" src="https://img-blog.csdn.net/2018070613584633"></p>
      </li>
      

    IX. 中文分词

    找到Solr7自带的中文分词器,solr_home\contrib\analysis-extras\lucene-libs下的lucene-analyzers-smartcn-7.4.0.jar。

    配置solrconfig.xml中配置jar包的lib标签:

    在managed-shchema添加中文分词的FieldType:

    <!-- 中文分词 -->
    <fieldType name="cn_text" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="org.apache.lucene.analysis.cn.smart.HMMChineseTokenizerFactory"/>
        </analyzer>
    </fieldType>

    修改商品名称、卖点以及目标域的Type为新定义的cn_text:

    <!-- 商品名称 -->
    <field name="title" type="cn_text" indexed="true" stored="true" />
    <!-- 商品卖点 -->
    <field name="sellPoint" type="cn_text" indexed="true" stored="true" />
    <!-- 目标域 -->
    <field name="tb_item_keywords" type="cn_text" indexed="true" stored="true" multiValued="true" />

    删除之前导入的索引:

    <delete><query>*:*</query></delete><commit/> 

    重启solr服务,导入数据。利用Query面板,查询sellPoint:卖点,得到155条结果表明分词成功。

    X. SolrJ客户端

    SolrJ简介

    Solrj就是Solr服务器的java客户端,提供索引和搜索的请求方法。SolrJ通常嵌入在业务系统中,通过solrJ的API接口操作Solr服务。

    搭建工程

    拷贝Jar包,共有三处:

    添加/修改索引

    在solr中,索引库中都会存在一个唯一键。如果一个Document的id存在,则执行修改操作,如果不存在,则执行添加操作。

    @Test
    public void insertOrUpdateIndex() throws IOException, SolrServerException {
        // solr服务的url,tb_item是前面创建的solr core
        String url = "http://localhost:8080/solr/tb_item";
        // 创建HttpSolrClient
        HttpSolrClient client = new HttpSolrClient.Builder(url)
            .withConnectionTimeout(5000)
            .withSocketTimeout(5000)
            .build();
    
        // 创建Document对象
        SolrInputDocument document = new SolrInputDocument();
        document.addField("id", "1111");
        document.addField("title", "Solr入门");
        document.addField("sellPoint", "Solr版本差异也太大了");
    
        client.add(document);
    
        client.commit();
    }

    查询插入结果:

    1530799029274

    修改titile为Solr进阶,再次运行代码,查询结果:

    删除索引

    • 根据指定ID来删除

      <pre class="has" name="code"><code class="hljs java"><span class="hljs-meta">@Test</span>
      

    public void deleteIndex() throws IOException, SolrServerException {
    String url = http://localhost:8080/solr/tb_item;
    HttpSolrClient client = new HttpSolrClient.Builder(url)
    .withConnectionTimeout(5000)
    .withSocketTimeout(5000)
    .build();
    client.deleteById(“1111”);
    client.commit();
    }


    • 根据条件删除

    • <pre class="has" name="code"><code class="hljs java"><span class="hljs-comment">// 根据条件删除</span>
      

      client.deleteByQuery(“id:1111”);
      // 全部删除
      client.deleteByQuery(":");

      简单查询

      @Test
          public void simpleSearch() throws IOException, SolrServerException {
              String url = "http://localhost:8080/solr/tb_item";
              HttpSolrClient client = new HttpSolrClient.Builder(url)
                      .withConnectionTimeout(5000)
                      .withSocketTimeout(5000)
                      .build();
              // 创建SolrQuery
              SolrQuery query = new SolrQuery();
              // 输入查询条件
              query.setQuery("sellPoint:手机");
              // 执行查询并返回结果
              QueryResponse response = client.query(query);
              // 获取匹配的所有结果
              SolrDocumentList list = response.getResults();
              // 匹配结果总数
              long count = list.getNumFound();
              System.out.println("总结果数:" + count);
      
              for (SolrDocument document : list) {
                  System.out.println(document.get("id"));
                  System.out.println(document.get("title"));
                  System.out.println(document.get("sellPoint"));
                  System.out.println(document.get("num"));
                  System.out.println(document.get("created"));
                  System.out.println(document.get("updated"));
                  System.out.println("================");
              }
      
          }

      条件查询

      • q - 查询关键字,必须的,如果查询所有使用*:*。请求的q是字符串;
      • fq - (filter query)过虑查询,在q查询符合结果中同时是fq查询符合的。例如:请求fq是一个数组(多个值);
      • sort - 排序;
      • start - 分页显示使用,开始记录下标,从0开始;
      • rows - 指定返回结果最多有多少条记录,配合start来实现分页;
      • fl - 指定返回那些字段内容,用逗号或空格分隔多个 ;
      • df-指定一个搜索Field;
      • wt - (writer type)指定输出格式,可以有 xml, json, php, phps;
      • hl 是否高亮,设置高亮Field,设置格式前缀和后缀。
      • facet 查询分组的数量(可与查询同步执行)
      • group 查询每个分组前几条的数据

      1530842397104

      SolrJ实现复杂条件查询:

      @Test
      public void complexSearch() throws IOException, SolrServerException {
          String url = "http://localhost:8080/solr/tb_item";
          HttpSolrClient client = new HttpSolrClient.Builder(url)
              .withConnectionTimeout(5000)
              .withSocketTimeout(5000)
              .build();
          SolrQuery query = new SolrQuery();
          // 输入查询条件
          query.setQuery("title:手机 AND sellPoint:移动");
          // 设置过滤条件
          query.setFilterQueries("id:[1000000 TO 1200000]");
          // 设置排序
          query.addSort("id", SolrQuery.ORDER.desc);
          // 设置分页信息(使用默认的)
          query.setStart(2);
          query.setRows(2);
          // 设置显示的Field的域集合(两种方式二选一)
          // query.setFields(new String[]{"id", "title", "sellPoint", "price", "status" });
          query.setFields("id,title,sellPoint,price,status");
          // 设置默认域
          // query.set("df", "product_keywords");
          // 设置高亮信息
          query.setHighlight(true);
          query.addHighlightField("title");
          query.setHighlightSimplePre("<span color='red'>");
          query.setHighlightSimplePost("</span>");
      
          // 执行查询并返回结果
          QueryResponse response = client.query(query);
          // 获取匹配的所有结果
          SolrDocumentList list = response.getResults();
          // 匹配结果总数
          long count = list.getNumFound();
          System.out.println("总结果数:" + count);
      
          // 获取高亮显示信息
          Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
          for (SolrDocument document : list) {
              System.out.println(document.get("id"));
              List<String> list2 = highlighting.get(document.get("id")).get("title");
              if (list2 != null)
                  System.out.println("高亮显示的商品名称:" + list2.get(0));
              else {
                  System.out.println(document.get("title"));
              }
      
          }
      }


      group

      solrQuery.setParam(GroupParams.GROUP,true);
      solrQuery.setParam(GroupParams.GROUP_FIELD,"id");
      // 设置每个quality对应的
      solrQuery.setParam(GroupParams.GROUP_LIMIT,"1");
      
      GroupResponse groupResponse =queryResponse.getGroupResponse();
      if(groupResponse !=null) {
           List<GroupCommand> groupList =groupResponse.getValues();
           for(GroupCommand groupCommand : groupList){
                List<Group> groups =groupCommand.getValues();
                for(Group group : groups) {
                  System.out.println(group.getGroupValue()+"\t"+group.getResult().getNumFound());
                }
           }
      }

      facet

      //查询分组数量
      solrQuery.setFacet(true);
      solrQuery.setFacetLimit(100);
      solrQuery.setFacetMissing(false);
      solrQuery.addFacetField("id");
      
      List<FacetField.Count> counts;
      List<FacetField> facetFieldList = queryResponse.getFacetFields();
      for (FacetField facetField : facetFieldList) {
          System.out.println(facetField.getName()+"\t"+facetField.getValueCount());
          counts = facetField.getValues();
          if (counts != null) {
              for (FacetField.Count count : counts) {
                   System.out.println(count.getName()+" "+count.getCount());
               }
          }
      }

       

    展开全文
  • 用途:在有需要对多个文档(doc/docx)进行多个关键字的搜索时,它能够实现批量进行,并能实现在界面上显示文档列表、每个文档包含的关键字、显示包含指定关键字的文字段(免开文档)、对关键字标注颜色等功能。...
  • 使用PageOffice开发平台,实现对word文档的在线处理,并搜索、显示含有关键字的文档。... 然后是关键字搜索功能,我们通过数据库中存储Word文档纯文本的字段,利用sql语句将包含关键字的文档搜索出来。
  • word文档快速检索软件
  • 我需要使用Servlet将MS Word文档存储和检索到MySQL 5.1中。我有上传文件的代码,但我不知道我可以加入表格。我已经在我要插入.doc文件的字段中使用了BLOB。这是我上传文件的代码片段:protected void doPost...

    我需要使用Servlet将MS Word文档存储和检索到MySQL 5.1中。我有上传文件的代码,但我不知道我可以加入表格。我已经在我要插入.doc文件的字段中使用了BLOB。

    这是我上传文件的代码片段:

    protected void doPost(HttpServletRequest request, HttpServletResponse response)

    throws ServletException, IOException {

    response.setContentType("text/html;charset=UTF-8");

    PrintWriter out = response.getWriter();

    try {

    // get access to file that is uploaded from client

    Part p1 = request.getPart("file");

    String type=p1.getContentType();

    String name=p1.getName();

    long size = p1.getSize();

    InputStream is = p1.getInputStream();

    //FileInputStream fis = is.

    // read filename which is sent as a part

    Part p2 = request.getPart("name");

    Scanner s = new Scanner(p2.getInputStream());

    String filename = s.nextLine(); // read filename from stream

    // get filename to use on the server

    String outputfile = this.getServletContext().getRealPath(filename); // get path on the server

    FileOutputStream os = new FileOutputStream (outputfile);

    // write bytes taken from uploaded file to target file

    int ch = is.read();

    while (ch != -1) {

    os.write(ch);

    ch = is.read();

    }

    os.close();

    out.println("

    File : '" + name + "' Type : '" + type + "' "

    + "of Size : " + ((double) size/1024) + "KB uploaded successfully!");

    }

    catch(Exception ex) {

    out.println("Exception -->" + ex.getMessage());

    }

    finally {

    out.close();

    }

    }

    在这里,我使用Servlets 3.0功能上传文件...

    我的表架构:

    resources

    - UserID [varchar(15)]

    - Document [mediumblob]

    任何人都可以帮助我如何将文档存储到表中,虽然BLOB是一种表示二进制数据的类型,但我如何检索为Word文档(* .doc)?

    展开全文
  • 使用solr检索word文档

    千次阅读 2017-05-12 09:44:40
    "application/word" ); up . setParam ( "literal.id" , "doc" ); up . setParam ( "fmap.content" , "attr_content" ); up . setParam ( "fmap.content_type" , "documentFormat" ); up . ...
    环境: 
    
    1.tomcat8.5
    2.jdk1.8.0_131
    3.solr5.5.4

    展开全文
  • 《完整word版)中国知网等文献检索的一般方法》由会员分享,可在线阅读,更多相关《完整word版)中国知网等文献检索的一般方法(9页珍藏版)》请在人人文库网上搜索。1、文献检索一般方法同学们:可能你们目前接触到的...

    《完整word版)中国知网等文献检索的一般方法》由会员分享,可在线阅读,更多相关《完整word版)中国知网等文献检索的一般方法(9页珍藏版)》请在人人文库网上搜索。

    1、文献检索一般方法同学们:可能你们目前接触到的文献并不多, 但以后你的 作业 和设计 很大一部分要求自己查阅文 献, 期刊,论文 来解决(比如说:微生物学,微生物工程工艺原理,酶工程,白酒工艺学,啤酒 工艺学,食品安全学,白酒勾兑等) 。在四川理工学院我们检索文献的方式不外乎在 图书馆 找纸质档案 和网络检索 两种,因为我们通常使用的文献都要求是 近三年核心期刊 发表的文 章,因为只有这些才能 反映某个领域目前发展的现状 ,所以我们一般都偏向于跟新更快的网 络搜索, 其中又以 知网 和超星 使用最多。 下面简单介绍文献检索的一般方法, 希望能给大家 的学习,包括实验室学习带来一点帮助,有不明白的。

    2、地方请直接联系我。1、检索课题名称(中英文) 计算机在中学物理中的应用The application of computer to physics in middle school2、分析研究课题 随着计算机技术的不断发展, 计算机在教育中的作用愈发突出。 在中学物理教育 中,同样可以引入计算的先进技术,改进教育方法,提高教学效率。如今,计算机在 中学物理中的应用主要体现在以下几个方面:1) 计算机技术在课件制作中的应用。2) 计算机在实验仿真中的应用。3) 计算机在教学数据处理中的应用。根据以上分析, 本课题主要是根据计算机在中学物理教学中的几个应用进行相关 材料的查找。3、检索策略3.1 。

    3、检索工具1) 利用“中国知网”查找有关硕士、博士论文。2) 利用“中国期刊全文数据库”查找相关期刊论文。3) 利用“维普科技期刊数据库” 查找相关期刊论文。4) 利用“超星数字图书馆”查找相关图书。5) 利用“ SpringLink ”查找相关论文。6)利用“百度”搜索相关知识。3.2 检索词1)计算机and中学 and物理教育2)计算机and课件制作3)计算机and物理实验and 仿真4)计算机and成绩分析4、检索步骤及检索结果4.1 检索工具中国知网(中国博士学位论文全文数据库、中国优秀硕士学位论文全文数据库)4.1.1 检索式1)题名 =计算机and物理教育2)主题 =计算机and物理。

    4、教育3)题名 =计算机and物理实验仿真4)主题 =计算机and物理实验仿真4.1.2 检索年限2000.1.1 2010.34.1.3 检索结果1 唐军 . 关于在高中物理中运用计算机辅助教学的探讨 . 华中师范大学 2003-07-31.中文摘要:随着教育技术理论的不断完善,人们对计算机辅助教学的研究已经逐渐 脱离了将计算机媒体与其它媒体进行比较的模式,转而将计算机纳入教学媒体系统 中,用科学的方法对教学进行设计, 这其中当然包括教学媒体的设计。 本文对计算 机辅助教学的相关概念、理论基础进行了重新审视。提出在新的时期,应该用发展 的眼光来看待这些概念和理论。只有这样才能找到计算机辅助教学。

    5、发展的新领域、 新方法。 笔者以高中物理学科的特点为基础, 探究了信息时代计算机辅助高中物理 教学相关理论,如:计算机辅助教学模式、特点,媒体设计等等的新发展。另外, 笔者还结合计算机相关技术多媒体技术、 计算机网络技术、 数据库技术的迅速发展, 尝试将传统物理课堂与多种计算机技术支持下的新的学习模式相结合,来提高中学 物理的教学质量。 本文共分为五章, 其中第一章阐述了计算机辅助教学的基本概念、 相关的理论基础及这些理论对计算机辅助教学的指导意义;第二章首先从物质、社 会、理论基础三个方面介绍了计算机辅助教学产生的必然性;然后根据计算机技术 和教育理论的发展分析了计算机辅助教学的发展脉络。2。

    6、 吴明和 . 多媒体 CAI 与物理教育研究 D. 中国优秀博硕士学位论文全文数据 库 ( 硕士),2001,(01)中文摘要:本文从教育学、心理学和计算机软硬件配置的角度探讨了计算机辅助教 育的发展 过程,并进一步探讨了物理多媒体 CAI 在物理教学中的应用以及物理多媒 体 CAI 的发展趋势。最后制作了三个物理多媒体课件。3 冯山,许毅, 徐澍, 朱大勇 .智能教育物理平台中层次结构的图元知识表示研究 四川师范大学学报 (自然科学版 ) :2002年 06 期 .中文摘要:论述了智能教育物理平台建设过程中基于图元知识表示的必要性 , 分析 了现有辅助类教育软件的不足 , 提出了一种基于分解。

    7、与组合思想和学科领域知识结 构特征的层次图元知识表示方法 , 其目的在于将物理问题求解和物理实验仿真的问 题表达统一于相同的图元知识元件中 . 已有的研究表明 , 这种表示体系是可行的 , 它有直观、清晰和自然的优点。4 卢云, 蒋爱莲 , 王明东 . 物理实验的计算机仿真系统介绍 .指挥技术学院学报: 1999 年 06 期中文摘要: 利用计算机及相应软件对物理实验的原理、 内容及仪器进行熟悉、 操作, 来完成实验预习、调试、数据采集、数据处理、误差分析及书写实验报告等实验过 程,介绍了物理实验仿真系统的特色、内容、使用及注意事项。5 杨晓翠 ,于春平 ,多媒体技术在物理教育中的应用 .白城。

    8、师范学院学报 : 2003 年 04 期中文摘要:本文主要介绍了多媒体技术的概念 , 阐述物理教育中应用多媒体技术的必 要性以及多 媒体技术在物理教育中的重要作用。4.2 检索工具维普中文科技期刊数据库4.2.1 检索式1) 计算机 and 中学 and 物理教育2) 多媒体 and 物理教育3) 仿真 and 物理实验4) 计算机 and 成绩分析4.2.2 检索年限2000.1.1 2010.5.14.2.3 检索步骤与结果5、检索结果评价本次检索采用 4 个中文数据库、 3 个网络搜索引擎、 1 个外文数据库, 查找到的信息 有博士论文、 优秀硕士论文、 期刊论文、 电子图书、 网络评论。

    9、等多种形式的资料, 内容完整, 且都是近十年的最新材料,有较高的参考价值。通过检索,不仅查找了课题相关信息, 也发 现了一些课题的新问题和新动向,检索结果良好。6、总结本次检索获得了 20 个检索结果,主要论述了计算机多媒体技术在物理教育中的应 用和利用计算机进行实验仿真技术的概况。文章 关于在高中物理中运用计算机辅助教学 的探讨 对计算机辅助教学的相关概念、 理论基础进行了重新审视, 并结合计算机相关技术 多媒体技术、 计算机网络技术、 数据库技术的迅速发展, 尝试将传统物理课堂与多种计算机 技术支持下的新的学习模式相结合, 来提高中学物理的教学质量。 文章多媒体 CAI 与物理 教育研究从教育学、心理学和计算机软硬件配置的角度探讨了计算机辅助教育的发展 过 程,并进一步探讨了物理多媒体 CAI 在物理教学中的应用以及物理多媒体 CAI 的发展趋势。中国知网使用图例打开四川理工学院主页,找到相关资源,选择图书资源选择 CNKI 搜索并输入关键词得到文献注意上面的选择项,一般情况下我们都会选择近三年核心期刊的文献选择下载的时候如果无法下载,请直接点进文档选择整本下载。文献的查看方式是 PDF 阅读器和 CAJ 阅读器,这两个阅读器大家可以直接在 360 软件里面 下载。注意:很多同学在宿舍是下载不了文献的,请转换成学校的网络。包括图书馆,教学楼,实 验楼,办公室的网络。

    展开全文
  • 当某一文档服务器中有很多Word文档,假如有成千上万个文档时,用户查找打开包含某些指定关键字的文档就变得很困难,目前网络上能找到的解决方案多是使用服务器端的Apache POI技术将所有文档的文本获取后存储到数据库...
  • 本文出自【我是干勾鱼的博客】 这里讲一下使用Lucene对doc、docx、pdf、txt文档进行全文检索功能的实现。涉及到的类一共有两个:LuceneCreateIndex,创建索引:package com.yhd.test.poi;import java.i
  • 使用spring boot+Elasticsearch 7.9.1+kibana 实现对word,pdf,txt等文件的非结构化数据全文内容检索
  • 使用ES全文检索.docx

    2020-03-25 16:22:34
    简单介绍了Windows上安装启动ELK,并且介绍了springboot2.x上集成ES,logstash创建配置文件,sql文件 模板文件等。
  • 文档检索——从Word、PPT、Excel文件中提取文本 要实现文档检索,首先需要得到纯文本形式的内容,其中一个办法是利用微软提供的类库,将文档另存为文本文件,缺点是需要运行环境
  • office文档全文检索以及在线预览

    万次阅读 多人点赞 2017-08-18 10:27:36
    office文档(word pdf excel txt ) 的lucene 全文检索以及在线预览
  • 这是lucene的使用案例,实现了对word文档中的关键字检索,并将检索出的内容高亮打印出来
  • 快速在多个word文件里面检索到关键字 标签: windows 之前看论文做了很多笔记,直接用word写的笔记。 然后,今天忽然需要过去做的一个笔记,但是只知道里面关键字xx。 所以看着我那一年的笔记量,我陷入的沉思,我...
  • 精准检索文档

    2012-10-17 14:12:01
    精准检索
  • 需求场景开发的web办公系统如果需要处理大量的Word文档(比如有成千上万个文档),用户一定提出查找包含某些关键字的文档的需求,这就要求能够读取 word 中的文字内容,而忽略其中的文字样式、表格、图片等信息。...
  • Elasticsearch索引文档word,pdf等】

    千次阅读 2019-02-15 16:42:30
    安装es5.x版本 需要把jvm设置调大,否则起不起来 sudo sysctl -w vm.max_map_count=262144 1.elasticsearch索引文件需要一个... 参考文档 es5.0之前 mapper-attachments h...
  • 基于elasticSearch做的全文检索,这是详细设计文档...包括结构化数据的检索,非结构化数据(文档类,如word,pdf等)检索。结构化数据,基于logstash导入。非结构化(文档),可以通过接口,本地扫描/远程扫描进入ES。
  • 文档检索与在线预览

    千次阅读 2017-05-02 13:49:07
    一、技术配置和实现思路技术配置: Lucene用于创建索引和搜寻 poi技术用于office文件的... openoffice用于文档转换成PDF pdf.js用户对文档的展示实现思路: 效果图: 二、技术简介本文使用的jar包: http:
  • 搜索word里包含的字;可以搜索某路径下的全部word文档,并可同时输入多个关键字,所搜结果写入到excel或txt中,excel附带文档的超链接。
  • ELK详细搭建及使用笔记word文档,包含所需文件下载地址。通过ELK(ElasticSearch + LogStash + Kibana = ELKStack),轻松几步搭建ELK环境,对数据进行实时监控和分析。 Elasticsearch是个开源分布式搜索引擎,...
  • Mongodb存储、读取Word文档

    千次阅读 2018-12-21 17:55:53
    在为人事系统做操作日志功能时,为了保证已经打印的信函可以还原,需要在每次打印信函时记录Word信函的内容。  SQL Server只能记录信函的文字内容,那信函的页面布局、字体格式等其他内容如何存储呢?此时Mongodb...
  • 可将Word和PDF文件转换为检索文本的工具可将Word和PDF文件转换为检索文本的工具
  • 前几天朋友让帮忙看下两份word文档有哪些差异?电脑上也不能同时观看两份word文档呀。今天小编教给大家一种核对两份word文档的小技巧,希望可以帮助到大家啊。 如果是不太会使用技巧的小伙伴就会觉得核对word...
  • import osimport docxspam=os.listdir('D:\\1')#获取文件夹下的word文档列表print(spam)for i in spam:  doc=docx.Document('D:\\1\\{}'.format(i))  doc.add_paragraph('world')  doc.save('D:\\1\\{}'.format(i...
  • Android读取并显示word文件的代码例子。用来演示在手机屏幕上显示wrod文档内容的功能,包括旧的doc格式与新的docx两种格式,而且支持图文混排内容的客户端展示。
  • 使用Java 解析word文档,包括获取标题和内容

    千次阅读 热门讨论 2019-07-19 12:17:46
    部分摘自https://blog.csdn.net/jane_feng/article/details/81221550 import ... import org.apache.log4j.Logger; import org.apache.poi.hwpf.HWPFDocument; import ...
  • 信息检索文档

    2012-04-26 17:50:34
    信息检索文档 给你完整的WORD文档的标准格式
  • 在多个Word文档中查找指定文件内容

    万次阅读 热门讨论 2016-08-09 13:20:41
    文件分捡工具,可以根据你的需要设置不同的关键词,如上图,只要搜索指定的关键词(以逗号分隔)...并可以通过点击分捡按钮,轻松的实现文件按检索词进行的自动分捡,把不同类别的文件放入各自类别的目录中,十分方便。

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 35,688
精华内容 14,275
关键字:

word文档检索功能