具有多个索引和复杂要求的全文搜索

时间:2011-03-04 07:46:46

标签: lucene full-text-search solr search-engine sphinx

我们正在构建一个应用程序,它要求我们为每个用户编制索引数据,以便我们可以对其数据进行全文搜索。以下是有关应用程序的一些值得注意的事项:

A)每个用户的数据与其他所有用户完全无关。这给我们带来了一些好处:

  1. 我们可以保持我们的索引很小 大小
  2. 合并/合并碎片索引 将花费更少的时间。
  3. 如果某些索引无法访问 无论出于何种原因(腐败?), 只有那些用户受到影响。 其他用户不受影响 为他们提供服务。
  4. B)每个用户可以拥有几种不同类型的数据。我们希望将每种类型保存在单独的文件夹中,原因与上述相同。

    因此,我们的索引层次结构将类似于:
    /user1/type1/<index files>
    /user1/type2/<index files>
    /user2/type1/<index files>
    /user3/type3/<index files>

    C)通常,可能在每次迭代时,我们都会添加可以编制索引的“类型”数据。
    因此,我们希望有一种有效/程序化的方法来为不同的“类型”添加模式。我们希望避免使用固定的索引模式。我喜欢Lucene的无模式索引方法。

    D)用户可以触发搜索查询,搜索查询:   - 在该用户的特定“类型”内   - 在该用户的所有类型中:在这种情况下,我们想要像Lucene那样触发并行查询。 (ParallelMultiSearcher

    E)我们要求对索引进行实时更新。 这是必须的。

    F)我们计划在多台机器上对索引进行分片。为此,我们希望:
     如果分片变得不可访问,则只有那些数据驻留在该分片中的用户才会受到影响。其他用户获得不间断的服务。

    我们正在考虑Lucene,Sphinx和Solr这样做。这就是我们发现的:

    • 狮身人面像:无法有效地做A,B, C,F。或者在那里?
    • Luecne:一切看起来都像 这是非常低的水平。但我们必须这样做 写包装来做F并构建一个 网络之间的沟通层 服务器和搜索服务器。
    • Solr:不确定我们能不能做A,B,C 容易。我们可以吗?

    所以,我的问题是什么是满足上述要求的最佳软件?如果我们得到所有要求,我更倾向于Solr,然后是Lucene。

2 个答案:

答案 0 :(得分:2)

我看不到Solr能够处理A或B,因为Solr的模型是将所有内容都放在一个索引中(每个 shard core)。如果您使用dynamic field types,Solr可以处理C.尽管Solr可以进行实时索引,但它并不像Lucene那么快(根据我的经验,即使使用Embedded Solr)。这一切都指向Lucene是您唯一的选择。

答案 1 :(得分:1)

我认为Solr在这里可能对你有用。

Solr的主要特点是在你的场景中适合你的是核心的概念。见http://wiki.apache.org/solr/CoreAdmin

您可以实现此目的的一种方法是每个用户/类型组合可以是单独的Solr核心。这满足(A)和(B)。客户端既可以将搜索引导到单个核心,也可以将搜索引导到多个核心(在不同的Solr服务器上可选),这是您在单个用户和所有类型中搜索时所需的内容。这满足(D)和(F)。或者,每个用户可以使用一个核心,并且可以使用“类型”字段进行过滤。

对于(C),Solr具有动态场的概念。见http://wiki.apache.org/solr/SchemaXml#Dynamic_fields

就(E)而言,Solr还没有“真正的”实时索引。但如果几秒钟的延迟是可以接受的,那么Solr可以处理它。