我正在尝试将 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。
添加回答
举报
0/150
提交
取消