使用Lucene构建“图书搜索”API。 我需要索引Lucene索引中的Book Name,Author和Book category字段。
一本书可以归入多个不同的图书类别......例如:
BookName1 - 小说,幽默,哲学。 BookName1 - 小说,科学。 BookName1 - 哼哼,生意。 BookName4幽默 等等......
用户应该能够搜索特定类别下的所有书籍,并说“homour”。
鉴于这种情况,我如何索引上面的字段并在lucene中构建查询?
答案 0 :(得分:32)
您可以多次出现Lucene文档的字段。创建文档,添加名称和作者的值,然后对每个类别执行相同的操作
当您在索引中搜索某个类别时,它将返回所有具有您所追求的值的类别字段的文档。该类别应为“关键字”字段。
我用英文写的,因为每个lucene版本的具体代码略有不同。
答案 1 :(得分:5)
您可以创建一个简单的“类别”字段,在该字段中列出按空格分隔的书籍的所有分类。
然后你可以搜索:
stock market AND category:(+"business")
或者,如果您想要搜索多个类别
stock market AND category:(+"business" +"philosophy")
答案 2 :(得分: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公开时,所有这些都被包装由许多客户端库,因此您不需要自己处理制作查询的低级细节。
他们的网站上有很多great documentation可以帮助您入门。