为了账号安全,请及时绑定邮箱和手机立即绑定

如何平面对象并应用于 Apache Solr 中的字段类型

如何平面对象并应用于 Apache Solr 中的字段类型

慕标5832272 2021-06-08 17:32:37
我正在尝试将 lucene tokenizer 迁移到 apache solr。我已经TokenizerFactory在 lucene 上为每个字段类型写过,比如标题、正文等。在 lucene 中,有一种方法可以将TokenStream添加到文档中的字段。在 solr 中,我们必须制作自定义的 Tokenizer/Filter 才能使用 lucene。我在特定领域遇到问题,我已经研究了许多博客和书籍,但这些都无法解决我的问题。在大多数博客和书籍中,他们使用 string,int 直接到 fieldtype。我已经为 apache solr 构建了自定义 TokenFilterFactory 并放置在我的 schema.xml 中,如下所示<fieldType name="text_reversed" class="solr.TextField"><analyzer>  <tokenizer class="solr.KeywordTokenizerFactory"/>  <filter class="analyzer.TextWithMarkUpTokenizerFactory"/>  <filter class="analyzer.ReverseFilterFactory" /></analyzer>当我尝试在 solr 上索引文档时 TextWithMarkUp textWithMarkUp = //get from method SolrInputDocument solrInputDocument = new SolrInputDocument(); solrInputDocument.addField("id", new Random().nextDouble()); solrInputDocument.addField("title", textWithMarkUp);在 Apache Solr 管理面板上,结果将如下所示{    "id":"0.4470506508669744",    "title":"com.xyz.data:[text = Several disparities are highlighted in the new report:\n\n74 percent of white male students said they felt like they belonged at school., tokens.size = 24], tokens = [Several] [disparities] [are] [highlighted] [in] [the] [new] [report] [:] [74] [percent] [of] [white] [male] [students] [said] [they] [felt] [like] [they] [belonged] [at] [school] [.] ",    "_version_":1607597126134530048}我无法在我的自定义 TokenStream 上获得 textWithMarkUp 实例,这将阻止我像之前使用 lucene 那样扁平化给定对象。在 lucene 中,我曾经在创建自定义 TokenStream 实例后设置 textWithMarkUp 的实例。下面是我的 textWithMarkUp 实例的 json 版本{"text": "The law, which was passed by the Louisiana Legislature and signed by Gov.","tokens": [    {        "category": "Determiner",        "canonical": "The",        "ids": null,        "start": 0,        "length": 3,        "text": "The",        "order": 0    },    //tokenized/stemmed/tagged all the words],"abbreviations": [],"essentialTokenNumber": 12}我遵循了TextWithMarkUpTokenizerFactory类的所有实现,但是一旦我们在 solr 上的 lib 文件夹下加载了 jar,Solr 将完全控制工厂类。那么有没有什么方法可以在 solr 的索引时间内设置给定的实例?我研究了更新请求处理器。无论如何这可以解决我的问题吗?
查看完整描述

1 回答

?
拉丁的传说

TA贡献1789条经验 获得超8个赞

Solr 搜索结果与索引系统收到的结果完全相同。这将是所有更新处理器处理后的原始输入。Solr 默认使用的更新处理器链不会更改输入。

模式中定义的分析链对搜索结果绝对没有影响——它们只影响在索引时和查询时生成的标记。存储的数据不受分析的影响。

当您使用自定义对象执行“addField”时,可能会调用以下 SolrJ 代码来确定要发送给 Solr 的内容。(val 是输入对象):

writeVal(val.getClass().getName() + ':' + val.toString());

这将创建一个字符串,其中包含类的名称,后跟类的字符串表示形式。正如 MatsLindh 在评论中所说,SolrJ 对您的自定义对象一无所知,因此数据不会作为您的自定义对象类型到达 Solr。


查看完整回答
反对 回复 2021-06-23
  • 1 回答
  • 0 关注
  • 114 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信