【问题标题】:Lucene: how to search EAV or 1:m?Lucene:如何搜索 EAV 或 1:m?
【发布时间】:2011-11-21 00:57:26
【问题描述】:

我正在使用 Zend Lucene,但不要认为问题是特定于该库的。

假设我想为图书数据库提供全文搜索。假设以下模型:

模型 1:

TABLE: book
- book_id
- name

TABLE: book_author
- book_author_id
- book_id
- author_id

TABLE: author
- author_id
- name

(一本书可以有 0 个或多个作者)

模型 2:

TABLE: book
- book_id
- name

TABLE: book_eav
- book_eav_id
- book_id
- attribute (e.g. "author")
- value (e.g. "Tom Clancy")

(一本书可以有 0 个或多个作者 + 有关出版商、页数等的信息)

我需要做什么才能将与特定书籍关联的所有作者插入到要索引的文档中?我是否将所有作者放在文档的一个字段中?我会使用某种分隔符对作者信息进行分组吗?我正在寻找使用此类数据的一般策略。

【问题讨论】:

    标签: search solr lucene full-text-search zend-lucene


    【解决方案1】:

    用分隔符将所有作者放在文档的一个字段中。 所以文档架构将是:

    book_id
    name
    author: |author 1|author 2|...|author n|
    other_attribute_1: |val 1|val 2|
    other_attribute_2: |val 1|val 2|
    

    使用此架构,您可以使用以下查询按作者搜索不同的提升:

    (author:"|Tom Clancy|")^10 OR 
    (author:"Tom Clancy")^5 OR 
    (author:Tom Clancy)^1
    

    此查询将首先显示完全匹配,然后显示短语匹配,最后显示其他匹配。

    【讨论】:

    • 你使用的分隔符有什么特别之处吗?可以是什么吗?还是竖条在 Lucene 中有特殊含义?
    • 分隔符不应出现在您的作者字符串中,它在 Lucene 中不应有任何特殊含义。但是您应该谨慎选择它,否则分析仪可以将其删除。所以你可以使用一些随机字符串,比如sadwqewqadweqg
    • 为什么要添加分隔符?为什么不直接使用空格来分隔作者?这样的事情仍然可以author:Tom Clancyauthor:"Tom Clancy" 工作,对吗?
    • 它会起作用,但您不能按确切作者搜索。您的第一个查询将与以下作者“Tom Blake”和“Jone Clancy”匹配一本书。您的第二个查询将匹配以下作者“Tom Clancy Jones”的书。
    猜你喜欢
    • 2010-11-26
    • 1970-01-01
    • 2012-09-25
    • 2011-10-12
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 2015-06-03
    • 2019-04-02
    相关资源
    最近更新 更多