24

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

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

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

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

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

4

3 回答 3

32

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

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

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

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

于 2009-01-05T10:25:00.053 回答
5

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

然后你可以搜索类似的东西:

stock market AND category:(+"business")

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

stock market AND category:(+"business" +"philosophy")
于 2008-12-31T09:52:16.483 回答
4

我会改用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 公开,所有这些都由一个数字包装客户端库,因此您不需要自己处理制作查询的低级细节。

他们的网站上有很多很棒的 文档可以帮助您入门。

于 2008-12-31T01:35:03.897 回答