多语言 SOLR 拼写检查设置
Multilingual SOLR Spellcheck Setup
我们正在尝试在 SOLR 中设置多语言拼写检查选项,并且刚刚完成基本 SOLR 环境的设置。
我们正在使用字段 'spell' 进行拼写检查。
<lst name="spellchecker">
<str name="name">default</str>
**<str name="field">spell</str>**
--Rest are not specified - solrdefaults to IndexBasedSpellChecker --
</lst>
已有语言字段 LANGUAGE_STRING 已被索引和存储。(目前不需要语言检测。)
有没有一种方法可以让我在 importing/updating 内容的同时使用此字段在下面构建额外的 spell_* 字段?
<requestHandler name="/select" class="solr.SearchHandler" lazy="true">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="spellcheck.dictionary">default</str>
**<str name="spellcheck.dictionary">spell_en</str>**
**<str name="spellcheck.dictionary">spell_de</str>**
<str name="spellcheck.count">1</str>
</lst>
<arr name="last-components">
<str>spellcheck</str>
</arr>
</requestHandler>
我打算按照 http://pavelbogomolenko.github.io/multi-language-handling-in-solr.html
中的建议,使用按文档语言字段进行语言分离的单核方法
还有另一个选项,即 SOLR Suggester 选项,它是专门为建议构建的,可替代拼写检查组件。
solr 附带的 techproducts 示例包含拼写提示器组件的示例配置。
https://cwiki.apache.org/confluence/display/solr/Suggester
http://lucidworks.com/blog/2015/03/04/solr-suggester/
回答我的问题的解决方案,以帮助正在寻找类似选项的其他人。
除了 Solr Suggester 替代方案之外,构建多语言拼写字典的解决方案是使用脚本更新处理器并使用 update.chain.
将其附加到 /update 处理程序
<updateRequestProcessorChain name="script">
<processor class="solr.StatelessScriptUpdateProcessorFactory">
<str name="script">update-script.js</str>
<lst name="params">
<str name="config_param">Spell_Field</str>
</lst>
</processor> ...
javascript更新-script.js文件如下:
function processAdd(cmd) {
var doc = cmd.solrDoc; // org.apache.solr.common.SolrInputDocument
var locale = doc.getFieldValue("locale");
logger.info("update-script#processAdd: site=" + site);
if(site){
var lang_str = site.substring(0,2);
logger.info("update-script#processAdd: language=" + lang_str);
if(lang_str){
var spellField = "";
var slash=" / "; //Use the Standard Tokenizer Factory
var field_names = doc.getFieldNames().toArray();
for(i=0; i < field_names.length; i++) {
field_name = field_names[i];
if ( field_name) { spellField+= doc.getFieldValue(field_name)+ slash;}
}
doc.addField("spell_text_"+lang_str,spellField); //Existing dynamic field definition(*_txt_en, *_txt_de, etc) in schema.xml per languauage tokenizes this.
logger.info("update-script#processAdd: spell_text_"+lang_str+ ":" + spellField);
}
}
}
function processDelete(cmd) { // no-op }
function processMergeIndexes(cmd) { // no-op }
function processCommit(cmd) { // no-op }
function processRollback(cmd) { // no-op }
function finish() { // no-op }
现在您可以使用这些 spell_txt_* 字段将它们连接到拼写检查器词典,并且您会根据语言获得建议。
我检查了几个来源,但对于大多数情况,以下内容应该足够了:
https://lucidworks.com/post/getting-started-spell-checking-with-apache-lucene-and-solr/
我们正在尝试在 SOLR 中设置多语言拼写检查选项,并且刚刚完成基本 SOLR 环境的设置。
我们正在使用字段 'spell' 进行拼写检查。
<lst name="spellchecker">
<str name="name">default</str>
**<str name="field">spell</str>**
--Rest are not specified - solrdefaults to IndexBasedSpellChecker --
</lst>
已有语言字段 LANGUAGE_STRING 已被索引和存储。(目前不需要语言检测。)
有没有一种方法可以让我在 importing/updating 内容的同时使用此字段在下面构建额外的 spell_* 字段?
<requestHandler name="/select" class="solr.SearchHandler" lazy="true">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="spellcheck.dictionary">default</str>
**<str name="spellcheck.dictionary">spell_en</str>**
**<str name="spellcheck.dictionary">spell_de</str>**
<str name="spellcheck.count">1</str>
</lst>
<arr name="last-components">
<str>spellcheck</str>
</arr>
</requestHandler>
我打算按照 http://pavelbogomolenko.github.io/multi-language-handling-in-solr.html
中的建议,使用按文档语言字段进行语言分离的单核方法还有另一个选项,即 SOLR Suggester 选项,它是专门为建议构建的,可替代拼写检查组件。
solr 附带的 techproducts 示例包含拼写提示器组件的示例配置。
https://cwiki.apache.org/confluence/display/solr/Suggester http://lucidworks.com/blog/2015/03/04/solr-suggester/
回答我的问题的解决方案,以帮助正在寻找类似选项的其他人。 除了 Solr Suggester 替代方案之外,构建多语言拼写字典的解决方案是使用脚本更新处理器并使用 update.chain.
将其附加到 /update 处理程序<updateRequestProcessorChain name="script">
<processor class="solr.StatelessScriptUpdateProcessorFactory">
<str name="script">update-script.js</str>
<lst name="params">
<str name="config_param">Spell_Field</str>
</lst>
</processor> ...
javascript更新-script.js文件如下:
function processAdd(cmd) {
var doc = cmd.solrDoc; // org.apache.solr.common.SolrInputDocument
var locale = doc.getFieldValue("locale");
logger.info("update-script#processAdd: site=" + site);
if(site){
var lang_str = site.substring(0,2);
logger.info("update-script#processAdd: language=" + lang_str);
if(lang_str){
var spellField = "";
var slash=" / "; //Use the Standard Tokenizer Factory
var field_names = doc.getFieldNames().toArray();
for(i=0; i < field_names.length; i++) {
field_name = field_names[i];
if ( field_name) { spellField+= doc.getFieldValue(field_name)+ slash;}
}
doc.addField("spell_text_"+lang_str,spellField); //Existing dynamic field definition(*_txt_en, *_txt_de, etc) in schema.xml per languauage tokenizes this.
logger.info("update-script#processAdd: spell_text_"+lang_str+ ":" + spellField);
}
}
}
function processDelete(cmd) { // no-op }
function processMergeIndexes(cmd) { // no-op }
function processCommit(cmd) { // no-op }
function processRollback(cmd) { // no-op }
function finish() { // no-op }
现在您可以使用这些 spell_txt_* 字段将它们连接到拼写检查器词典,并且您会根据语言获得建议。
我检查了几个来源,但对于大多数情况,以下内容应该足够了: https://lucidworks.com/post/getting-started-spell-checking-with-apache-lucene-and-solr/