如何使用 Apache SOLR 和 PHP 代码突出显示搜索结果

2024-04-12

我使用 SOLR 和 Tomcat servlet 容器开发了搜索页面。使用 PHP 代码,我将搜索查询发布到 solrQuery() 函数中,并在此函数中定义了查询参数,如下所示。

$query = "?q=".trim(urlencode($q)) &version=2.2&start=0&rows=10&indent=on&hl=true&hl.fl=title";

我已经传递了突出显示的“hl=true&hl.fl=title”参数。我不知道如何在搜索页面中解析/显示突出显示的结果?

谁能帮我?


Solr 中突出显示的工作方式如下:

在带有结果的 XML 响应的开头,您会看到一个“结果”节点,其中包含包含搜索结果的子“doc”节点。像这样的事情:

 <doc>
  <str name="body">Merge transfer will merge one item with another. The new item can be either from same location or from different location. Merge transfer directions:  Open your Paper Tiger Online and select the database. Select item(s) you want to merge except for the one you want to merge the items into, click on Transfer and select Merge. A pop up will be opened asking New Location, once you select the location, the items in the location will be loaded in to the “File to Merge”.  Select a file in the “File to Merge” list. Choose whether you want to be reminded to move this file or not  Click Merge File  Add any additional keywords, notes, action date, change category (if necessary)  Click Merge Item button  If you chose to be reminded, you'll need to click the Confirm box to confirm the merge, then the merge will happen. (You can also cancel the merge from the Confirm page) </str>
  <str name="current-tags"/>
  <str name="id">141156</str>
  <str name="title">What is a merge transfer? How do I merge files?</str>
 </doc>

在带有结果的 XML 响应的末尾,您将看到一个名为“highlighting”的“lst”节点。您会注意到,在每个节点中,您将看到一个子“lst”节点,其名称为您为文档选择的唯一标识符。像这样的事情:

<lst name="141154">
  <arr name="body">
    <str>Transfers are used to move or &lt;em&gt;merge&lt;/em&gt; the items from one location and another location and creating duplicates items in the locations. You might want to move and item from Action to Reference or Archive to an off-site location. You would want to move the item in Paper Tiger to ensure you can find it</str>
  </arr>
</lst>

对我来说最简单的方法就是首先遍历“结果”节点并将变量设置为搜索结果的内容。然后,在显示每个项目的循环中,我循环遍历“突出显示”节点并搜索该项目的 ID 以查看是否找到匹配项。如果找到匹配项,我将用突出显示的内容覆盖原始变量的内容。

这样,无论是否找到突出显示的匹配项,您都将显示结果。

    cURL_address($curl_url);

$xml = new SimpleXMLElement($data);

    foreach ($xml->children() as $node) {

        $arr = $node->attributes();   // returns an array
        $no_results = FALSE;

        //When no results are found

        if ($arr["name"] == "response" && $arr["numFound"] == 0) {

            echo "No results found for '". $query ."'";
            $no_results = TRUE;

        }

        if ($arr["name"] == "response") {

            if ($no_results != TRUE) {
                echo "<h4 id=\"search_results\">Search results for '".$query."'</h4>";
            } 

            foreach ($node->doc as $response) {

                //Initially set all the variables to the non-highlighted content

                $entry_title = $response->str[3];
                $entry_body = substr($response->str[0], 0, 300)."&#8230;";
                $entry_id = $response->str[2];
                $entry_tags = $response->str[1];

                //logic to see if we need to add ellipsis to start/end of body
                $orig_body_beggining = substr($response->str[0], 0, 10);
                $orig_body_end = substr($response->str[0], -10);

                //Now loop through every highlighted field to see if we have a node that matches the original item's ID

                foreach ($xml->lst[1]->lst as $hl_data) {

                    $arr2 = $hl_data->attributes();   // returns an array

                    $hl_arr = $arr2["name"];

                    if ((string)$entry_id == (string)$hl_arr) {

                        foreach ($hl_data->arr as $hl_content) {

                            $arr3 = $hl_content->attributes();

                            //Use a switch to overwrite existing variables if a new one exists that is highlighted

                            switch($arr3['name']) { // Get attributes as element indices
                                case 'body':
                                    $f_ellip = NULL;
                                    $l_ellip = NULL;
                                    if ($orig_body_beggining != substr((string)$hl_content->str, 0, 10)) {
                                        $f_ellip = "&#8230; ";
                                    }
                                    if ($orig_body_end != substr((string)$hl_content->str, 0, -10)) {
                                        $l_ellip = " &#8230;";
                                    }
                                    $entry_body = $f_ellip.(string)$hl_content->str.$l_ellip;
                                    break;
                                case 'title':
                                    $entry_title = (string)$hl_content->str;
                                    break;
                                case 'current-tags':
                                    $entry_tags = (string)$hl_content->str;
                                    break;
                                }

                        }

                    }
                }

让我知道你的想法!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Apache SOLR 和 PHP 代码突出显示搜索结果 的相关文章

  • ZF3/2 - 如何捕获 EVENT_DISPATCH 侦听器中引发的异常?

    有什么方法可以在 EVENT DISPATCH 监听器中抛出异常吗 class Module public function onBootstrap EventInterface event application event gt get
  • 使用 crypt() 加密

    我目前正在做一个非常安全的登录系统 但我是 crypt 函数的新手 需要一些快速帮助 我在注册过程中使用 crypt 加密密码字符串并将其保存到数据库中 但是 我如何在登录过程中解密密钥 或者我应该怎么做 或者是否可以对提交的密码字符串进行
  • 如果产品重量超过1000克,如何以公斤为单位显示

    在 Storefront 主题中 我使用下面的代码将格式化重量从 1000g 更改为 1kg add action woocommerce after shop loop item title show weight 10 function
  • 克隆和引用传递问题

    所以在过去的几天里 我一直在绞尽脑汁地试图让一个类能够正确克隆 问题是克隆不会删除 重做任何引用传递 结果是 主数据对象仍然作为引用传递 从而完全抵消了克隆的效果 这是问题的简化版本 class my class private data
  • 如何在 Laravel 5 中对合并集合进行分页?

    我正在创建一个包含两种类型的对象的流 BluePerson 和 RedPerson 为了创建流 我获取所有这两个对象 然后将它们合并到一个集合中 这样做之后 我需要对它们进行分页 但是分页似乎是针对雄辩的模型和数据库查询 而不是集合 我见过
  • 将扩展配置文件实体添加到 FOS UserBundle

    我正在尝试扩展 FOS UserBundle 以允许扩展配置文件实体除了基本 UserBundle 字段之外还保存其他信息 因为我的网站上有多种类型的用户 所以我创建了单独的实体来保存个人资料信息 我的实体设置如下 class UserPr
  • 如何在 PHP 中运行 shell 脚本?

    我正在尝试使用 PHP 触发 shell 脚本的运行 本质上 当用户在我们用 PHP 编写的网站上完成一个操作时 我们希望触发一个 shell 脚本 该脚本本身调用一个 Java 文件 提前致谢 See shell exec http ph
  • PHP 和 MySQL 的重音字符错误

    我的问题是 直接通过 PHP 编写的内容是正确重音的 但是当重音单词来自 MySQL 时 字母会像这样 我尝试使用html charset as ISO 8859 1它修复了 MySQL 字母 但破坏了其他字母 解决这一切的一种方法是设置我
  • 如何使用php在mysql数据库中添加照片? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我对 PH
  • PHP:展平数组-最快的方法? [复制]

    这个问题在这里已经有答案了 是否有任何快速方法可以在不运行 foreach 循环的情况下展平数组并选择子键 在本例中为 键 和 值 或者 foreach 始终是最快的方法 Array 0 gt Array key gt string val
  • PHP多图像文件上传并存储到文件夹和数据库

    我正在建立一个网站 向夜间狂欢者展示大城市夜总会场所和活动的列表 我正在尝试构建一个后端页面 管理员可以在其中添加俱乐部并输入信息 例如机构名称 位置 相对价格等 当然还有俱乐部的一些图像 每个俱乐部必须至少有一张图像 即主图像 可以有额外
  • 我应该使用排队系统来处理付款吗?

    我在用着Slim https www slimframework com和这个结合Stripe 的 PHP 库 https stripe com docs api php在我的应用程序中处理付款 一切都很好 但是直到最近 我在我的系统中发现
  • SVG 转 JPG / PNG

    有没有工作模块可以convert a SVG image into像素格式如JPEG or PNG 看看蜡染工具包 具体来说是光栅化器 http xmlgraphics apache org batik tools rasterizer h
  • 除括号之间的内容外,所有内容均小写

    考虑以下字符串 LoReM FOO IPSUM dolor BAR Samet fooBar 我正在寻找一种方法来小写所有内容 除了 brackets 之间的内容应该被忽略 所以期望的输出是 lorem FOO ipsum dolor BA
  • 您可以使用 MySQL 查询来完整创建数据库的副本吗

    我有一个包含 5 个表的 MySQL 数据库的实时版本和一个测试版本 我不断使用 phpMyAdmin 将实时版本中的每个表复制到测试版本 有谁有mysql查询语句来制作数据库的完整副本吗 查询字符串需要考虑结构 数据 自动增量值以及与需要
  • 如何在 PHP >= 5.3 严格模式下向对象添加属性而不产生错误

    这必须很简单 但我似乎找不到答案 我有一个通用的 stdClass 对象 foo没有属性 我想添加一个新属性 bar尚未定义 如果我这样做 foo new StdClass foo gt bar 1234 严格模式下的 PHP 会抱怨 将属
  • PHP 相当于朋友或内部

    php 中是否有相当于 朋友 或 内部 的东西 如果没有 是否有任何模式可以遵循来实现这种行为 Edit 抱歉 但标准 Php 不是我想要的 我正在寻找类似于马戏团长所做的事情 我有一些类在后端进行 C 风格的系统调用 并且杂耍已经开始变得
  • 有关于 PHP 中的 V8JS 的文档吗?

    有没有关于V8JS的文档 我是否只需要标准 PHP 或一些扩展即可使用 V8JS 我将非常感谢有关 PHP 中的 V8JS 的任何信息 要求 PHP 5 3 3 和 V8 库和标头安装在正确的路径中 Install http www php
  • 在 PHP 命令行上显示完整的堆栈跟踪

    Problem 我的 PHP 堆栈跟踪缩写为 Stack trace 0 www html table app create php 128 SoapClient gt call call Array 1 www html table ap
  • MYSQL 按喜欢/不喜欢和受欢迎程度排序

    我有评论表 其中包括喜欢和不喜欢的内容 现在我在正确的顺序上遇到了问题 实际上 我的系统在顶部显示了最多点赞的评论 我正在 youtube 上寻找类似系统的东西 这意味着 100like 100dislikes 的评论的顺序高于 1 1 我

随机推荐

  • 汇编程序中的重定位截断错误

    我对汇编语言完全陌生 我尝试编写简单的程序来破译凯撒密码 问题是链接后我收到以下错误 cezar o In function loop text 0xbf relocation truncated to fit R X86 64 8 aga
  • 通过环境变量告诉 ld 在哪里查找目录

    我正在对课程的 C 和 C 文件进行评分 并且此作业使用 GSL 库 由于我的计算机没有 root 权限 因此我的 GSL 库安装在我的主目录中 因此我需要告诉编译器和链接器在哪里可以找到它 当我自己编写程序时 这不是问题 因为我只需向 g
  • 按字典值对字典列表进行排序

    我有以下字典列表 a 23 100 3 103 2 102 36 103 43 123 我如何对其进行排序以获得 a 43 123 3 103 36 103 2 102 23 100 我的意思是 按字典值对列表进行降序排序 除了brandi
  • Puppeteer - 如何使用 page.evaluateHandle

    我在使用最新版本的 puppeteer 时遇到一些问题 我正在使用 puppeteer 版本 0 13 0 我有一个包含此元素的网站 div class header hey there div 我正在尝试运行这段代码 const head
  • 在 boost 几何体中创建实心多边形

    我是增强几何的新手 我已经创建了多边形boost geometry assign points 但我只创建该多边形的外部和内部是空的 所以我尝试测试boost geometry overlaps 两个多边形 A B 且 A 在 B 内部 结
  • Mysql按分钟查询、选择、分组、求和

    我有一个像这样的数据库表 id donation type donation amount time inserted 1 em1 20 2012 12 07 10 01 00 2 em1 50 2012 12 07 10 01 00 3
  • 如何使用 Java 开发 iPhone 应用程序? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道是否可以使用 Java 加 XMLV 来开发 iPhone 应用程序 XMLV 声称可以将基于 Java 的 Android
  • jquery-ajax 多次调用

    我使用以下代码来发出多个 ajax 请求 如下所示 request 1 start 要求1 finish 要求2 start 要求2 finish 这是代码 var startingpoint fireRequest 1 each type
  • 如何将清单信息添加到delphi项目中

    添加最简单的方法是什么
  • 如何在 Haskell 中使用 TypeApplications?

    With XTypeApplications在 GHC 8 0 中 您可以使用显式指定类型 前面的函数参数 它到底指定了什么类型 尤其是当有多个类型时 有介绍吗 如果你看一下函数的类型 elem Foldable t Eq a gt a g
  • 适用于 Android/Java 的“自从/以前的时间”库 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 对于 Android Java 显示时间的好库有什么建议吗 例如 10 分钟前 5 天前 来自 Goog
  • 多个目标名称具有相同的动画

    只是一个疑问 我的 WPF 应用程序中有三个图像 我将为这三个图像提供闪烁效果 所以我给出了这段代码
  • 多个等待与 Task.WaitAll - 等效吗?

    从性能上来说 这2个方法会跑吗GetAllWidgets and GetAllFoos 在平行下 有什么理由使用其中一种而不是另一种吗 编译器在幕后似乎发生了很多事情 所以我不清楚 方法A 使用多个等待 public async Task
  • 重定向 PHP [重复]

    这个问题在这里已经有答案了 如何从 PHP 页面重定向到另一个页面 div div a href login html class ui btn left Back a div div
  • 根据旋转角度计算XY运动?

    假设我在 2D 空间中有一个可以旋转的对象 然后应该根据其旋转角度移动 例如 如果角度为0 指向上方 则on timer它应该将 1 移动 Y 将 0 移动 X 如果角度为 45 那么它应该按 Y 移动 1 按 X 移动 1 如果指向 90
  • 使用 Postgresql 让 Sqlalchemy 在过滤器中使用日期

    我正在尝试在 Sqlalchemy 中执行以下查询 Select from Mytable where Date date time field 2011 08 16 我尝试了几种方法 有些在这里 但没有一个看起来 现实 因为有些确实强制转
  • Python urllib2:即使在 HTTPError 异常期间也读取内容主体?

    我正在使用 urllib2 通过 HTTP 获取页面 有时 当我的请求包含错误时 资源会抛出 HTTP 错误 400 错误请求 但是 该响应还包含一个提供详细错误消息的 XML 元素 能够看到该错误而不仅仅是 urllib2 返回的 HTT
  • getResourceAsStream(file) 在哪里搜索文件?

    我很困惑getResourceAsStream 我的包结构如下 src net floodlightcontroller invoked getResourceAsStream here resources floodlightdefaul
  • 查找mysql死锁原因

    1 我有一个脚本 执行一些更新 删除操作 2 所有sql操作都在事务内执行 InnoDb表 3 有时我会收到 尝试获取锁定时发现死锁 尝试重新启动事务 该应用程序中还有一些其他作业执行数据库操作 我的问题是找出其他脚本中的哪些并发查询会干扰
  • 如何使用 Apache SOLR 和 PHP 代码突出显示搜索结果

    我使用 SOLR 和 Tomcat servlet 容器开发了搜索页面 使用 PHP 代码 我将搜索查询发布到 solrQuery 函数中 并在此函数中定义了查询参数 如下所示 query q trim urlencode q versio