Zend搜索Lucene匹配

时间:2011-10-18 10:44:18

标签: zend-framework search lucene zend-search-lucene

好的,所以假设我有一个搜索查询给我一些Zend_Search_Lucene_Search_QueryHit对象,其中包含与查询匹配的Zend_Search_Lucene_Document对象。 我有一个小问题,如何从匹配查询str的文档中简单地检索字段的名称,以突出显示它? 我希望一切都清楚,不要明显解决:))... 非常感谢 亚历克斯

1 个答案:

答案 0 :(得分:0)

假设“name”,“address”,“phone”是您的Zend_Search_Lucene_Field :: Text类型的字段,并且您有一个字段Zend_Search_Lucene_Field :: Unstored称为“content”这可以使用“ strpos <轻松解决/强>“:

    $hits = $index->find($query);

    foreach ($hits as $hit) {
      $result = array();
      if (strpos($hit->name , $query)) {
        $result[$hit->id]['name'] = $query->highlightMatches($hit->name)
      } else {
        $result[$hit->id]['name'] = $hit->name
      }

      if (strpos($hit->address, $query)) {
        $result[$hit->id]['address'] = $query->highlightMatches($hit->address)
      } else {
        $result[$hit->id]['address'] = $hit->address
      }

      if (strpos($hit->phone, $query)) {
        $result[$hit->id]['phone'] = $query->highlightMatches($hit->phone)
      } else {
        $result[$hit->id]['phone'] = $hit->phone
      }
   }

您的手机字段可能是Zend_Search_Lucene_Field ::关键字或其他内容。如果这些以前的字段都没有突出显示,则意味着您的内容中找到了$ query字符串,因为它是Zend_Search_Lucene_Field :: Unstored字段而未保存。你应该做的是将另一个类型Zend_Search_Lucene_Field :: Text字段添加到你的$ doc并称之为“excerpt”

$doc->addField(Zend_Search_Lucene_Field::Text('excerpt', substr($content, 0, 100)));

并将此添加到您之前的“foreach”循环

if (strpos($hit->excerpt, $query)) {
    $result[$hit->id]['excerpt'] = $query->highlightMatches($hit->excerpt)
  } else {
    $result[$hit->id]['excerpt'] = $hit->excerpt
  }