【问题标题】:SOLR indexing arbitrary dataSOLR 索引任意数据
【发布时间】:2019-11-27 22:00:49
【问题描述】:

假设您有一个简单的表单自动化应用程序,并且您想要索引 Solr 集合中每个提交的表单。假设表单内容是开放式的,因此用户可以在表单上创建自定义字段等等。

由于用户可以定义自定义表单,因此您无法真正为 Solr 预定义字段,因此我们一直在使用 Solr 的“无模式”或托管模式模式。它工作得很好,除了一个问题。

假设一个表单带有一个名为“ID”的字段和一个值为“9”的字段。如果这是 Solr 第一次看到一个名为“ID”的字段,它会尽职地更新它的模式,并且由于该字段的值是数字,Solr 为其分配一个数字数据类型的数据类型(我们看到“plong “ 很多)。

现在,假设第二天,有人提交了相同表单的另一个实例,但在 ID 字段中,他们输入了自己的姓名,而不是输入数字。 Solr 将其吐出并且不会索引此记录,因为架构说 ID 应该是数字,但在此记录上,它不是。

到目前为止,我们处理这个问题的方法是捕获当字段的数据类型与架构不一致时我们得到的异常,然后我们使用 Solr API 来更改架构,使有问题的字段成为文本或字符串而不是数字。

当然,当我们这样做时,我们需要重新索引整个集合,因为架构发生了变化,因此我们需要保留所有原始数据,以防万一我们需要在这些架构数据之一之后重新索引所有内容 -类型冲突。我们是 Solr 的忠实粉丝,但与此同时,我们想知道使用搜索引擎的好处是否超过了用户只需在以前的数字字段中输入字符数据而触发的所有这些额外工作。

有没有办法让 Solr 总是为每个字段分配类似“text_general”的东西,或者还有其他更好的方法吗?

【问题讨论】:

    标签: solr


    【解决方案1】:

    我想说您可能需要在应用程序端处理 Id 值。 最好为Id 添加一个验证,即Id 应该是stringnumberic。 这将永久解决您的问题。如果确定了这种类型,则您无需在 solr 端执行任何操作。

    另一种方法是使用固定的schema.xml。 在此添加一个字段Id 和一个固定的fieldType。 如果不希望它标记数据并希望在搜索中完全匹配,我建议您使用string 作为 ID 的 fieldType。

    如果您希望灵活地搜索Id 字段,则可以为该字段添加text_general 字段类型。

    您也可以创建自己的fieldType,并根据您对字段Id的要求提供tokenizerfilter

    也不要在生产中使用无模式模式。您还可以将字段名称映射到动态字段定义。为文本字段创建一个动态字段,例如 *_t。您所有以_t 结尾的字段都将映射到此。

    【讨论】:

    • 我没有看到如何管理该字段,这样我们就不会遇到同样的问题。显示给用户的表单有一个声明为非数字字符串的控件 - 如果第一个在此字段中输入数据的用户输入一个数字,Solr 将其解释为一个数字字段,即使它不是 - 然后当有人随后输入一个(完全有效的)非数字值,由于类型不匹配,Solr 不会索引该记录。
    • 因此您在 solr 中定义名为 Id 的字段并使用文本类型,并将传入数据映射到该字段。你是如何索引数据的......?不要在无模式模式下运行 solr......
    • 1) 不要在生产中使用无模式模式(因为您遇到的问题) 2) 将您的字段名称映射到与动态字段定义匹配的内容,例如 <name>_t 用于文本字段。表单字段名称和索引中的字段名称之间无需保持 1:1 的映射关系。
    • @MatsLindh:抱歉——我对 Solr 的流利程度并没有达到应有的水平,所以我希望你能给我一个更好的例子。假设我们有这样的 XML:some value。今天,一旦这在 Solr 中被索引,我们可以通过在搜索中指定“custom_field=whatever”来搜索“custom_field”的特定值。您是否建议将其更改为预定义为文本的常量字段名称和值(例如,custom_field)?如果我们这样做,用户将如何搜索“custom_field”的特定值?
    • Solr 的 Schema 是 Solr 用来确定如何索引字段以实现可搜索性以及如何处理该字段的定义。如果您不是setting up a schema using schema.xml or the Schema API,则将使用为该字段类型索引的第一个值的类型。对于第二个用例,我建议在名为*_t 的模式中定义一个动态字段,这意味着以_t 结尾的所有内容都将作为文本处理,然后以<field name="custom_field_t">some value</field> 发送(Solr 语法)
    猜你喜欢
    • 2013-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-25
    • 2023-04-06
    • 1970-01-01
    • 2014-07-07
    • 2010-12-10
    相关资源
    最近更新 更多