【问题标题】:Field having multiple distinct values具有多个不同值的字段
【发布时间】:2008-12-30 22:47:21
【问题描述】:

我正在使用 Lucene 构建一个“图书搜索”API。 我需要在 Lucene 索引中索引 Book Name、Author 和 Book category 字段。

一本书可以属于多个不同的书籍类别...例如:

书名1——小说、幽默、哲学。 书名1——小说、科学。 书名1——幽默、商业。 书名4-幽默 等等……

用户应该能够搜索特定类别下的所有书籍,例如“homour”。

鉴于这种情况,我如何索引上面的字段并在 lucene 中构建查询?

【问题讨论】:

    标签: lucene


    【解决方案1】:

    您可以让 Lucene 文档的字段出现多次。创建文档,添加姓名和作者的值,然后对每个类别执行相同操作

    • 创建新的 lucene 文档
    • 添加名称字段和值
    • 添加作者字段和值
    • 对于每个类别:
      • 添加类别字段和值
    • 将文档添加到索引

    当您在索引中搜索类别时,它将返回所有具有类别字段的文档,其中包含您所追求的值。类别应为“关键字”字段。

    我用英文写的,因为每个 lucene 版本的具体代码略有不同。

    【讨论】:

    • 这不会创建多个文档吗?如果你有 300 万条记录会发生什么?每本书有3-5个类别?你有 9-1500 万条记录。我想知道是否有其他方法可以达到同样的效果。
    • 不,您只有一份文件。它不像您管理架构和索引的数据库。您必须放松一下,让 Lucene 处理索引,这真的很聪明。
    • 这在 Zend_Search_Lucene 中不起作用: Zend_Search_Lucene_Document::addField( $field ) { $this->_fields[$field->name] = $field; 的源代码返回$这个; }
    • 如何测试是否保存了所有类别?当我写一个查询时,我只得到一个文档返回的第一个类别。
    • 排名函数是否会将多个字段中的匹配项视为同一字段中多个标记的匹配项?
    【解决方案2】:

    您可以创建一个简单的“类别”字段,在其中列出以空格分隔的书籍的所有类别。

    然后你可以搜索类似:

    stock market AND category:(+"business")
    

    或者如果您想搜索多个类别

    stock market AND category:(+"business" +"philosophy")
    

    【讨论】:

      【解决方案3】:

      我会改用Solr - 它基于 Lucene 构建并由 ASF 管理,但比 Lucene 更容易使用,尤其是对于新手而言。

      如果提供几乎所有 Lucene 的主线功能(当然是您描述的项目所需的一切),以及额外的东西,如快照、复制、模式......

      在 Solr 中,您只需在 schema.xml 中定义要索引的字段即可:

      <field name="book_id" type="string" indexed="true" stored="true" required="true" multiValued='false'/>
      <field name="book_name" type="text" indexed="true" stored="true" required="true" multiValued='false' />
      <field name="book_authors" type="text" indexed="true" stored="true" required="true" multiValued='true' />
      <field name="book_categories" type="textTight" indexed="true" stored="true" required="true" multiValued='true' />
      

      请注意,multiValued='true' 属性可让您有效地将数组或列表传递给该字段,该字段会被 Solr 很好地拆分和索引。

      一旦你有了这个,启动 Solr,你可以询问像“book_authors:Hemingway”或“book_categories:Romance book_categories:Mills”这样的查询。

      有几个预先编写和配置的查询处理程序供您执行诸如解析复杂查询(模糊匹配、布尔运算、评分提升等)之类的事情,并且由于 Solr 的 API 通过 HTTP 公开,所有这些都被包装由许多客户端库组成,因此您无需自己处理制作查询的低级细节。

      他们的网站上有很多 great documentation 可以帮助您入门。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-03-31
        • 2014-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-13
        • 1970-01-01
        相关资源
        最近更新 更多