gpt4 book ai didi

java - 如何在 Apache Solr 中扁平化对象并应用于字段类型

转载 作者:行者123 更新时间:2023-12-02 10:57:14 25 4
gpt4 key购买 nike

我正在尝试将 lucene tokenizer 迁移到 apache solr。我已经为 lucene 上的每个字段类型(如标题、正文等)编写了 TokenizerFactory 。在lucene中,有一种方法可以添加TokenStream到文档中的字段。在 solr 中,我们必须制作自定义分词器/过滤器才能与 lucene 一起工作。我在给定领域遇到问题,我已经研究了许多博客和书籍,但它们无法解决我的问题。在大多数博客和书籍中,他们都使用 string,int 直接表示字段类型。

我已经为 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
}

以下代码是我想要做的

public class TextWithMarkUpTokenizer extends Tokenizer {
private final PositionIncrementAttribute posIncAtt;
protected int tokenIndex = -1; // index of the current token in the collection of metaQTokens
protected List<MetaQToken> metaQTokens;
protected TokenStream tokenTokenizer;

public TextWithMarkUpTokenizer() {
MetaQTokenTokenizer metaQTokenizer = new MetaQTokenTokenizer();
tokenTokenizer = metaQTokenizer;
posIncAtt = addAttribute(PositionIncrementAttribute.class);
}

public void setTextWithMarkUp(TextWithMarkUp text) {
this.markup = text == null ? null : text.getTokens();
}

@Override
public final boolean incrementToken() throws IOException {
//get instance of TextWithMarkUp here
}

private void setCurrentToken(Token token) {
((IMetaQTokenAware) tokenTokenizer).setToken(token);
}
}

我已经遵循了 TextWithMarkUpTokenizerFactory 类的所有实现,但是一旦我们在 solr 上的 lib 文件夹下加载了 jar,Solr 将完全控制工厂类。

那么有没有什么方法可以在 solr 索引期间设置给定实例?我研究过Update Request Processors 。无论如何,这可以解决我的问题吗?

最佳答案

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

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

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

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

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

关于java - 如何在 Apache Solr 中扁平化对象并应用于字段类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51632368/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com