代码之家  ›  专栏  ›  技术社区  ›  Richard Knop

Zend\u搜索\u Lucene帮助

  •  2
  • Richard Knop  · 技术社区  · 15 年前

    编辑:

    我已通过以下方法解决了该问题:

    +"lorem ipsum" +type:photo
    +"lorem ipsum" +type:video
    

    但另一个问题是索引返回的结果正确,但id错误(id是主键)。更具体地说,返回的id字段比我用来构建索引的数据库中的真实id(id-1)少1个。

    真奇怪。


    "lorem ipsum" AND +type:photo
    "lorem ipsum" AND +type:video
    

    第一个查询应该只查找type=photo的结果,第二个查询只搜索视频。但他们都在归还照片和视频。

    以下是我如何构建索引:

        // create media index
        $index = Zend_Search_Lucene::create('/data/media_index');
        // get all media
        $media = $this->_getTable('Media')->get();
        // iterate through media and build index
        foreach ($media as $m) {
    
            $doc = new Zend_Search_Lucene_Document();
    
            $doc->addField(Zend_Search_Lucene_Field::UnIndexed('id',
                                                               $m->id));
            $doc->addField(Zend_Search_Lucene_Field::UnIndexed('thumb_path',
                                                               $m->thumb_path));
            $doc->addField(Zend_Search_Lucene_Field::Keyword('title',
                                                             $m->title));
            $doc->addField(Zend_Search_Lucene_Field::UnStored('description',
                                                              $m->description));
            $doc->addField(Zend_Search_Lucene_Field::Keyword('type',
                                                             $m->type));
    
            $index->addDocument($doc);
    
        }
        // commit the index
        $index->commit();
    

    下面是我如何搜索它的:

        $index = Zend_Search_Lucene::open('/data/media_index');
        $this->view->photos = $index->find('"lorem ipsum" AND +type:photo');
        $this->view->videos = $index->find('"lorem ipsum" AND +type:video');
    

    2 回复  |  直到 15 年前
        1
  •  2
  •   Jesta    15 年前

    我只是在自己的搜索索引上运行了一些测试,问题似乎出在查询本身,而不是代码。查询中的“AND”是运算符,“+”也是运算符。查询解析器似乎被双运算符逻辑弄糊涂了,因为它们之间没有任何术语。这是我在他们的文档中找到的一个整体报价:

    string '"lorem ipsum" AND +type:photo' (length=29)
    
    object(Zend_Search_Lucene_Search_Query_MultiTerm)[230]
      private '_terms' => 
        array
          0 => 
            object(Zend_Search_Lucene_Index_Term)[236]
              public 'field' => null
              public 'text' => string 'lorem' (length=5)
          1 => 
            object(Zend_Search_Lucene_Index_Term)[237]
              public 'field' => null
              public 'text' => string 'ipsum' (length=5)
          2 => 
            object(Zend_Search_Lucene_Index_Term)[238]
              public 'field' => null
              public 'text' => string 'and' (length=3)
          3 => 
            object(Zend_Search_Lucene_Index_Term)[239]
              public 'field' => null
              public 'text' => string 'type' (length=4)
          4 => 
            object(Zend_Search_Lucene_Index_Term)[240]
              public 'field' => null
              public 'text' => string 'photo' (length=5)
    

    稍微更改查询,删除 AND + ,并且仅使用1。

    string '"lorem ipsum" +type:photo' (length=25)
    string '"lorem ipsum" AND type:photo' (length=28)
    
    object(Zend_Search_Lucene_Search_Query_Boolean)[227]
      private '_subqueries' => 
        array
          0 => 
            object(Zend_Search_Lucene_Search_Query_Phrase)[230]
              private '_terms' => 
                array
                  0 => 
                    object(Zend_Search_Lucene_Index_Term)[233]
                      public 'field' => null
                      public 'text' => string 'lorem' (length=5)
                  1 => 
                    object(Zend_Search_Lucene_Index_Term)[234]
                      public 'field' => null
                      public 'text' => string 'ipsum' (length=5)
          1 => 
            object(Zend_Search_Lucene_Search_Query_Term)[235]
              private '_term' => 
                object(Zend_Search_Lucene_Index_Term)[232]
                  public 'field' => string 'type' (length=4)
                  public 'text' => string 'photo' (length=5)
    

    唯一的区别是: :

      private '_signs' => 
        array
          0 => boolean true
          1 => boolean true
    

    :

      private '_signs' => 
        array
          0 => null
          1 => boolean true
    

    这个 运算符要求结果中需要两个搜索查询,其中 + 仅要求右侧的值必须是必需的。

    "lorem ipsum" AND type:photo

        2
  •  2
  •   TomáÅ¡ Fejfar    15 年前

    关于“id问题”,我想“id”是用来访问每个结果的内部变量。因此,我建议将字段重命名为“entryId”,然后使用 $resultItem->entryId