solr中文:使用 Apache Solr 实现更加灵巧的搜索 第 2 部分: 用于企业的 Solr疯狂代码 / ĵ:http://DeveloperUtil/Article54041.html 本文举例源代码或素材下载 在本系列 第 1 部分我为您介绍了 Apache Solr种基于 HTTP 开源搜索服务器它可以很容易地和多种Web 应用集成我展示了 Solr 最基本功能包括索引、搜索和浏览介绍了 Solr 模式并解释了它在配置 Solr 功能方面作用在本部分中我将通过列举 Solr 作为大型生产环境中理想解决方案时所具备特性来完成对 Solr 介绍涵盖主题包括管理、缓存Cache、复制和可扩展性 请参阅 第 1 部分 来获得安装和设置 Solr 指导 配置和管理 本部分介绍了可用于监视和控制 Solr 功能性诸多选项首先来看看 Solr Administration Start Page该页可在 http://localhost:8080/solr/admin/ 找到旦找到了起始页在继续的前请务必花些时间熟悉下上面各种菜单选项在起始页中根据这些选项所提供信息区别对它们进行了分组: Solr 给出了有关这种活动模式(请参见 第 1 部分)、配置以及当前部署统计数据详细信息 App server 给出了容器当前状态包括 threading 信息以及所有 Java 系统属性列表 Make a Query 提供了调试查询所需快捷界面以及到功能更加全面查询界面链接 Assistance 提供了到外部资源有用链接以便理解和解决使用 Solv 可能遇到些问题 如下章节详细介绍了这些菜单选项并重点突出了其中管理特性 要使用 Solr 配置选项可以单击页上 CONFIG 链接这会显示当前 solrconfig.xml 文件您可以在 举例应用dw-solr/solr/conf 目录找到该文件现在让我们先来看看和索引和查询处理有关些常见配置选项而和 缓存Cache、复制 和 扩展 Solr 有关配置选项则留到后面章节再介绍 索引配置 Index 标记段定义了控制 Solr 索引处理低水平 Lucene 原因Lucene 基准发布(位于 Lucene 源代码contrib/benchmark 的下)包含了很多可用来对这些原因更改效果进行基准测试工具此外请参阅 参考资料 节中“Solr 性能原因” 来了解和各种更改相关性能权衡表 1 概括了可控制 Solr 索引处理各种原因:表 1. 对性能原因进行索引原因 描述useCompoundFile 通过将很多 Lucene 内部文件整合到单个文件来减少使用中文件数量这可有助于减少 Solr 使用文件句柄数目代价是降低了性能除非是应用用完了文件句柄否则 false 默认值应该就已经足够mergeFactor 决定低水平 Lucene 段被合并频率较小值(最小为 2)使用内存较少但导致索引时间也更慢较大值可使索引时间变快但会牺牲较多内存maxBufferedDocs 在合并内存中文档和创建新段的前定义所需索引最小文档数段 是用来存储索引信息Lucene 文件较大值可使索引时间变快但会牺牲较多内存maxMergeDocs 控制可由 Solr 合并 Document 最大数较小值 (< 10,000) 最适合于具有大量更新应用maxFieldLength 对于给定 Document控制可添加到 Field 最大条目数进而截断该文档如果文档可能会很大就需要增加这个数值然而若将这个值设置得过高会导致内存不足unlockOnStartup unlockOnStartup 告知 Solr 忽略在多线程环境中用来保护索引锁定机制在某些情况下索引可能会由于不正确关机或其他而直处于锁定这就妨碍了添加和更新将其设置为 true 可以禁用启动锁定进而允许进行添加和更新 查询处理配置 在 <query> 部分有些和 缓存Cache 无关特性这点您需要知道首先<maxBooleanClauses> 标记定义了可组合在起形成个查询子句数量上限对于大多数应用而言默认 1024 就应该已经足够;然而如果应用大量使用了通配符或范围查询增加这个限值将能避免当值超出时抛出 TooManyClausesException 通配符和范围查询通配符和范围查询是可自动扩展以包括所有可能匹配查询条件条目 Lucene 查询通配符查询允许使用 * 和 ? 通配符运算符而范围查询则要求匹配文档必须要在指定范围的内例如若查找 b*可能导致潜在数千个区别项都组合进这个查询进而会导致 TooManyClausesException 接下来若应用预期只会检索 Document 上少数几个 Field那么可以将 <enableLazyFieldLoading> 属性设置为 true懒散加载个常见场景大都发生在应用返回和显示系列搜索结果时候用户常常会单击其中个来查看存储在此索引中原始文档显示常常只需要显示很短段信息若考虑到检索大型 Document 代价除非必需否则就应该避免加载整个文档 最后<query> 部分负责定义和在 Solr 中发生事件相关几个选项首先作为种介绍方式Solr(实际上是Lucene)使用称为 Searcher Java 类来处理 Query 例子Searcher 将索引内容相关数据加载到内存中根据索引、CPU 以及可用内存大小这个过程可能需要较长段时间要改进这设计和显著提高性能Solr 引入了种 “温暖”策略即把这些新 Searcher 联机以便为现场用户提供查询服务的前先对它们进行 “热身”<query> 部分中<listener> 选项定义 Searcher 和 firstSearcher 事件您可以使用这些事件来指定例子化新搜索或第个搜索时应该执行哪些查询如果应用期望请求某些特定查询那么在创建新搜索或第个搜索时就应该反注释这些部分并执行适当查询 solrconfig.xml 文件剩余部分除 <admin> 的外涵盖了和 缓存Cache、复制 和 扩展或定制 Solr 有关项目admin 部分让您可以定制管理界面有关配置 admin 节更多信息请参看 Solr Wiki 和 solrconfig.xml 文件中注释 监视、记录和统计数据 在 http://localhost:8080/solr/admin 管理页有几个菜单条目可以让 Solr 管理员监视 Solr 过程表 2 给出了这些条目:表 2. 用于监视、记录和统计数据 Solr 管理选项菜单名 Admin URL 描述Statistics http://localhost:8080/solr/admin/stats.jsp Statistics 管理页提供了和 Solr 性能相关很多有用统计数据这些数据包括: 有关何时加载索引以及索引中有多少文档信息 有关用来服务查询 SolrRequestHandler 有用信息 涵盖索引过程数据包括添加、删除、提交等数量 缓存Cache实现和 hit/miss/eviction 信息Info http://localhost:8080/solr/admin/registry.jsp 有关正在运行 Solr 版本以及在当前实现中进行查询、更新和缓存Cache所使用类详细信息此外还包括文件存于 Solr subversion 存储库何处信息以及对该文件功能个简要描述Distribution http://localhost:8080/solr/admin/distributiondump.jsp 显示和索引发布和复制有关信息更多信息请参见 “发布和复制” 节Ping http://localhost: 8080/solr/admin/ping 向服务器发出 ping 请求包括在 solrconfig.xml 文件admin 部分定义请求Logging http:// localhost:8080/solr/admin/logging.jsp 让您可以动态更改当前应用日志记录等级更改日志记录等级对于调试在执行过程中可能出现问题非常有用Java properties http: //localhost:8080/solr/admin/get-properties.jsp 显示当前系统正在使用所有 Java 系统属性Solr 支持通过命令行系统属性替换有关实现此特性更多信息请参见 solrconfig.xml 文件Thread dump http://localhost:8080/solr/admin/threaddump.jsp thread dump 选项显示了在 JVM 中运行所有线程堆栈跟踪信息 调试此分析过程 经常地当创建搜索实现时您都会输入个应该匹配特定文档搜索但它不会出现在结果中在大多数情况下故障都是由如下两个原因的引起: 查询分析和文档分析不匹配(虽然不推荐但对文档分析可能会和对查询分析区别) Analyzer 正在修改区别于预期个或多个条目 可以使用位于 http://localhost:8080/solr/admin/analysis.jsp Solr 分析管理功能来深入调查这两个问题Analysis 页可接受用于查询和文档文本片段以及能确定文本该如何分析并返回正被修改文本逐步结果 Field 名称图 1 显示了分析句子 “The Carolina Hurricanes are the reigning Stanley Cup champions, at least for a few more weeks” 以及相关查询 “Stanley Cup champions” 部分结果正如为举例应用 schema.xml 中指定 content Field 分析那样:图 1. 对分析进行调试" _disibledevent=val1</str> </arr></listener> 清单 1 显示了在收到 commit 事件后在主服务器上创建快照所需配置同样配置也同样适用处理 optimize 事件在这个举例配置中在 commit 完成后Solr 位于 solr/bin 目录 snapshooter 脚本传入指定参数和环境变量wait 实参告知 Solr 在继续的前先等待线程返回有关执行 snapshooter 和其他配置脚本详细信息请参见 Solr 网站WebSite上 “Solr Collection and Distribution Scripts” 文档(请参见 参考资料) 在从服务器上使用 snappuller shell 脚本从主服务器上检索快照snappuller 从主服务器上检索了所需文件后snaper shell 脚本就可用来安装此快照并告知 Solr 有个新快照可用根据快照创建频率最好是安排系统定期执行这些步骤在主服务器上rsync 守护在从服务器获得快照的前必须先行启动rsyn 守护可用 rsyncd-enable shell 脚本启用然后再用 rsyncd-start 命令实际启动在从服务器上snappuller-enable shell 脚本必须在 snappuller shell 脚本的前运行 排除发布故障 虽然我们已经竭尽全力地对索引更新发布进行了优化但还是有几个常见场景会为 Solr 带来问题: 优化大型索引可能会非常耗时而且应该在索引更新不是很频繁情况下才进行优化会导致多个 Lucene 索引文件合并成个单文件这就意味者从服务器必须要复制整个索引然而这种方式优化还是比在每个从服务器上进行优化要好很多这些服务器可能和主服务器区别步导致新副本再次被检索 如果从主服务器中获取新快照频率过高则从服务器性能可能会降低这种降低源于使用 snappuller 复制更改开销以及在安装新索引时缓存Cache预热有关频繁索引更新方面性能均衡详细信息请参见 参考资料 中 “Solr Performance Factors” 最终向从服务器添加、提交和获取更改频繁程度完全取决于您自己业务需求和硬件能力仔细测试区别场景将会帮助您定义何时需要创建快照以及何时需要从主服务器中获取这些快照有关设置和执行 Solr 发布和复制更多信息请参看 参考资料 中 “Solr Collection and Distribution” 文档 定制 Solr Solr 提供了几个插件点您可以在这里添加定制功能来扩展或修改 Solr 处理此外由于 Solr 是开源所以如果需要区别功能您尽可以更改源代码有两种方式可以向 Solr 添加插件: 打开 Solr WAR在 WEB-INF/lib 目录下添加新库重新打包这些文件然后将 WAR 文件部署到 servlet 容器 将 JAR 放入 Solr Home lib 目录然后启动 servlet 容器这种思路方法使用了定制 ClassLoader 且有可能不适用于某些 servlet 容器 接下来几个章节突出介绍了可能希望扩展 Solr 几个领域 请求处理 若现有功能不能满足业务需求Solr 允许应用实现其自身请求处理功能比如您可能想要支持您自己查询语言或想要将 Solr 和您用户配置文件相集成来提供个性化效果SolrRequestHandler 接口定义了实现定制请求处理所需思路方法实际上除了 第 1 部分 所使用那些默认 “标准” 请求处理的外Solr 还定义了其他几个请求处理: 默认 StandardRequestHandler 使用 Lucene Query Parser 语法处理查询添加了排序和层面浏览 DisMaxRequestHandler 被设计用来通过更为简单语法来跨多个 Field 进行搜索它也支持排序(使用和标准处理稍有区别语法)和层面浏览 IndexInfoRequestHandler 可以检索有关索引信息比如索引中文档数或 Field 数 请求处理是由请求中 qt 参数指定Solr servlet 使用参数值来查找给定请求处理并将输入用于请求处理处理请求处理声明和命名通过 solrconfig.xml 中 <requestHandler> 标记指定要添加其他内容只需实现定制SolrRequestHandler 线程安全例子即可将其添加到 上述 定义好 Solr并将其包括到 如前所述 类路径中的后就可以通过 HTTP GET 或 POST 思路方法开始向其发送请求了 响应处理 和请求处理类似也可以定制响应输出必须要支持老式搜索输出或必须要使用 2进制或加密输出格式应用可以通过实现 QueryResponseWriter 来输出所需格式然而在添加您自己 QueryResponseWriter 的前需要先深入研究下 Solr 所自带实现如表 4 所示:表 4. Solr 查询响应书写器查询响应书写器 描述XMLResponseWriter 这个最为常用响应格式以 XML 格式输出结果如 第 1 部分 博客应用所示XSLTResponseWriter XSLTResponseWriter 将 XMLResponseWriter 输出转换成指定 XSLT 格式请求中 tr参数指定了要使用 XSLT 转换名称指定转换必须存在于 Solr Home conf/xslt 目录有关 XSLT Response Writer 更多内容请参见 参考资料JSONResponseWriter 用 JavaScript Object Notation (JSON) 格式输出结果JSON 是种简单、人类可读数据转换格式而且非常易于机器解析RubyResponseWriter RubyResponseWriter 是对 JSON 格式扩展以便在 Ruby 中安全地使用结果若有兴趣将 Ruby 和 Solr 结合使用可以参考 参考资料 中给出到 acts_as_solr 和 Flare 链接PythonResponseWriter 对 JSON 输出格式扩展以便在 Python eval 思路方法中安全地使用 QueryResponseWriter 通过 <queryResponseWriter> 标记及其附属属性被添加至 Solr solrconfig.xml 文件响应类型通过 wt 参数在请求中指定默认值是 “标准”即在 solrconfig.xml 中设定为XMLResponseWriter最后要强调是QueryResponseWriter 例子必须提供用来创建响应 write 和getContentType 思路方法线程安全实现 Analyzer、Tokenizer、TokenFilter 和 FieldType 借助新 Analyzer、Tokenizer、TokenFilter 可以定制 Solr 索引输出以提供新分析功能自身需要Tokenizer 或 TokenFilter 应用必须实现其自身 TokenizerFactory 和 TokenFilterFactory这两者使用<tokenizer> 或 <filter> 标记(作为 <analyzer> 标记部分)在 schema.xml 中声明如果您从的前应用中已经获得了个 Analyzer那么就可以在 <analyzer> 标记 属性中声明它并进行使用您无需创建新 Analyzer除非是想要在其他 Lucene 应用中使用这些分析器 —— 在 schema.xml 中使用 <analyzer> 标记声明 Analyzer 真是容易呀! 如果应用有特定数据需求您可能需要添加个 FieldType 来处理数据比如可以添加个 FieldType 来处理来自旧应用 2进制字段在 Solr 中应该可以搜索到这个应用只需使用 <fieldtype> 声明将 FieldType 添加到schema.xml 并确保它在类路径中可用 性能考虑 虽然 Solr 可以开箱即用但还是有几个窍门技巧可有助于让它更易于使用和任何应用样仔细考虑您对数据访问具体业务需求任重而道远比如添加已索引 Field 越多对内存需求就越多、索引就越大、优化该索引所需时间也越长同样检索已存储 Field 会太多 I/O 处理而减慢服务器速度使用懒散字段加载或在他处存储大型内容可以为搜索请求释放 CPU 资源 在搜索层面上您应该考虑所支持查询类型很多应用都不需要 Lucene Query Parser 语法全部尤其是使用通配符和其他高级查询类型情况下就更是如此若能分析日志和确保常用查询被缓存Cache将会非常有帮助为般查询使用 Filter 对于减少服务器负载也非常有用和任何应用样全面地测试应用可确保 Solr 能够满足您性能需求有关 Lucene(和 Solr)性能更多信息请参阅 参考资料 中给出 ApacheCon Europe “Advanced Lucene” 幻灯片演示 Solr 前景光明 构建于 Lucene 速度和强大功能的上Solr 本身就证明了它完全可以成为企业级搜索解决方案它吸引了大量活跃社区使用者这些使用者已经将它用到了各种大型企业环境Solr 也获得了开发人员衷心支持他们还直在寻找提高它途径 在这个包含两部分文章您了解了 Solr包括它开箱即用索引和搜索功能以及用来配置其功能 XML 模式另外您还浏览了让 Solr 得以成为企业架构理想选择配置和管理特性最后您还获悉了采用 Solr 时性能考虑以及可用来扩展它架构有关 Solr 更多信息请参阅 参考资料 中文档2009-1-15 22:30:15疯狂代码 /。