【问题标题】:Best Way to Build a Lucene Search Index for Searching Contacts构建用于搜索联系人的 Lucene 搜索索引的最佳方法
【发布时间】:2012-01-25 18:44:56
【问题描述】:

我正在使用 Lucene 搜索联系人数据库。联系人是指姓名、多个电话号码、电子邮件、地址等。在数据库中,这些显然分为单独的字段甚至单独的表。我希望能够根据任何字段搜索联系人,例如我可以输入“John Doe”,Lucene 会返回 John Doe 的联系信息。 John Doe 也有一个电话号码,我希望能够通过输入该电话号码、地址或电子邮件等来找到他的记录。我不想具体说明我正在搜索的字段。

创建索引时,最好将所有数据合并到一个“数据”字段中,还是将它们分开?除了用于从数据库中检索所有其他数据的 id 之外,我不会将数据存储在索引中。标准分析器和查询解析器在我的情况下会很好地工作,还是我应该采取更多的自定义方法?

我对 Lucene 还很陌生,正在学习它的强大功能,所以我并不反对真正涉足它并创建一些复杂的自定义搜索查询,但我需要一些指导并希望避免这样做如果根本没有必要,就必须做所有这些。

【问题讨论】:

    标签: lucene


    【解决方案1】:

    您无需创建单个组合字段,将它们分开可能是更好的设计决策。仔细想想,您可能想做专门的搜索。

    您可以使用 MultiFieldQuery 来搜索名称、地址、城市等所有字段...

    【讨论】:

    • KISS - 根据给定的当前要求,就简单性、空间和搜索速度而言,单个包罗万象的字段将是最佳选择。此外,现代用户不会指定要搜索的字段。他们希望系统自己弄清楚 Ala google 搜索栏。
    【解决方案2】:

    使用单个搜索字段是最有效的解决方案。这将使您的索引更小,搜索速度更快。即使您存储了字段,您仍然可以使用一个聚合索引(但未存储)字段进行搜索,并为每个联系人信息存储一个(但未索引)字段。

    标准分析器和查询分析器将帮助您快速构建原型,但您可能需要使用自定义分析器来改进您的应用程序,例如,如果您需要:

    • 独立于变音符号 (ASCIIFoldingFilter) 提供相同结果的查询,
    • 处理电话号码中的空格(以便“0532”查询匹配“0532”以及“05 32”)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-22
      • 1970-01-01
      • 2012-01-19
      • 2019-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多