我正在使用 Lucene 构建“图书搜索”API。我需要在 Lucene 索引中索引 Book Name、Author 和 Book category 字段。
一本书可以属于多个不同的书籍类别……例如:
书名1——小说、幽默、哲学。书名1——小说、科学。书名1——幽默、商业。BookName4-幽默等等......
用户应该能够搜索特定类别下的所有书籍,例如“homour”。
鉴于这种情况,我如何索引以上字段并在 lucene 中构建查询?
我正在使用 Lucene 构建“图书搜索”API。我需要在 Lucene 索引中索引 Book Name、Author 和 Book category 字段。
一本书可以属于多个不同的书籍类别……例如:
书名1——小说、幽默、哲学。书名1——小说、科学。书名1——幽默、商业。BookName4-幽默等等......
用户应该能够搜索特定类别下的所有书籍,例如“homour”。
鉴于这种情况,我如何索引以上字段并在 lucene 中构建查询?
您可以让 Lucene 文档的字段出现多次。创建文档,添加名称和作者的值,然后对每个类别执行相同操作
当您在索引中搜索类别时,它将返回所有具有您所追求的值的类别字段的文档。类别应该是“关键字”字段。
我用英文写的,因为每个 lucene 版本的具体代码略有不同。
您可以创建一个简单的“类别”字段,在其中列出以空格分隔的书籍的所有类别。
然后你可以搜索类似的东西:
stock market AND category:(+"business")
或者,如果您想搜索多个类别
stock market AND category:(+"business" +"philosophy")
我会改用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 公开,所有这些都由一个数字包装客户端库,因此您不需要自己处理制作查询的低级细节。