【问题标题】:How can I relate search indexes to models in MVC?如何将搜索索引与 MVC 中的模型相关联?
【发布时间】:2013-05-23 05:43:23
【问题描述】:

我有一个需要能够搜索的 MVC 应用程序。该应用程序是模块化的,因此模块需要易于注册数据以使用搜索模块进行索引。

目前,只有一个适合灵活性的快速临时解决方案,但速度始终是个问题。模块注册它们希望可搜索的模型(以及关系和列)。搜索时,搜索功能使用这些关系查询数据并应用 Levenshtein,删除停用词,进行字符替换等。显然,随着数据量的增加,这将减慢速度,因此保留它是不可行的,因为它实际上是 select * from x,y,z 然后通过数据挖掘。

上述的好处是与找到数据的模型有直接关系。例如,如果Model_Product 找到了一些东西,我知道在我的代码中我可以使用Model_Product::url() 将结果关联到相关位置,或者使用Model_Product::find(other data) 来显示图像或描述,如果在以标题为例。

上述的另一个好处是它已经是特定于数据库的,因此可以直接放到虚拟主机上就可以了。

我已经阅读了各种选项,它们看起来都非常相似,因此人们不太可能在不引发讨论或辩论的情况下提出“正确”的选项,但要记录在案;从以下选项来看,Solr 似乎是我倾向于的选项。我不是一成不变的,所以如果有人有任何他们想分享的建议或我可以查看的其他选项,那就太好了。

浏览各种教程和指南,它们似乎都相对容易设置和配置。在上述情况下,我可以让模块注册配置文件/搜索索引模型的路径,并让搜索器通过搜索程序 x 运行它们。这将建立我的索引,并提供查询数据的方法。很好。

我不明白这些索引与我的其他代码有何关联。如果我对数据进行索引、搜索并反过来使用 Solr 找到结果,我怎么知道如何获取与它找到的位相关的所有其他信息?

还有人能够确认我是否需要为每个虚拟主机提供上述任何一个实例?这是我似乎找不到太多信息的东西。我会假设我可以连接到单个实例并告诉它哪些数据是相关的?就像使用凭据 x 连接到数据库 y 连接到单个 DBMS 服务器一样。

当然,我没有像通常那样广泛阅读这方面的内容,因为我目前在方向方面有点卡住了,我宁愿不阅读有关所有内容的所有内容,而是寻求一些建议那些在我选择特定路线之前就知道的人。

编辑:This question 似乎让我更倾向于 Solr。还有一个类似的线程 here 对 Sphinx 有相当多的了解。

【问题讨论】:

    标签: solr lucene search-engine elasticsearch sphinx


    【解决方案1】:

    免责声明:我只能谈论 Lucene/Solr,而且我相信 ElasticSearch,因为我知道它是基于 Lucene。其他人可能会也可能不会以同样的方式工作。

    如果我索引数据、搜索并依次找到 Solr 的结果,如何 我知道如何获取与该位相关的所有其他信息吗 找到了吗?

    您可以存储任何您想要的额外数据,例如指向数据库中特定行的数据库键。 Lucene/Solr 还可以帮助您查找相关信息,例如如果您经营一家 DVD 出租店并且用户拼错了电影名称,Lucene 会为您解决这个问题,并且(与 DB 不同)仍然会列出最接近的替代方案。您还可以通过在索引或查询期间提升某些字段来提供提示。 geospatial search 等有特殊的扩展名。显然,如果需要,您可以提供自己的扩展名。

    还有人能够确认我是否需要 每个虚拟主机的上述任何一个实例?

    Lucene 是一个低级库,必须存在于您运行的每个 JVM 中。 Solr(建立在 Lucene 之上)是一个 HTTP 服务器。您可以从任意数量的客户端调用它。更多缩放选项解释here

    【讨论】:

    • 补充:ElasticSearch 和 Solr 一样,也是一个 http-server。
    • 我怎么能指定一个特定的模型名称,或者在数据集中找不到的信息,但是关于带有索引信息的数据集。例如,如果我索引我的products 表,我希望索引能够引用回 Model_Product 以便我知道行 ID,因此可以使用 Model_Product 获取与我的结果相关但不一定在该特定行,即相关表。我还没有找到有关如何执行此操作的信息。
    • 您需要将数据结构非规范化为平面文档。换句话说,您需要将外键存储到另一个实体以便可以检索,或者索引相关的实体字段,或两者兼而有之。
    • 我可以轻松存储外键等,这很好,因为它在数据集中。我真正需要的是能够存储无法使用查询找到但自动与该数据相关的额外信息。例如,我可以使用select * from products 来构建产品集合,但是在检索该数据时,我需要知道例如数据来自哪个表。有什么办法可以说select * from products + some static data not in the database
    • 这绝对是可能的,并且取决于您如何实现与 Solr 的集成。对文档进行索引的请求可能包含必要的附加信息,因此您可以添加 product_source 字段。 Solr 并不真正关心这些数据的来源——让它成为数据库、您的代码或其他任何东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-31
    相关资源
    最近更新 更多