Solr 建议 - 使用 DocumentDictionaryFactory 进行上下文过滤返回整个字段

Posted

技术标签:

【中文标题】Solr 建议 - 使用 DocumentDictionaryFactory 进行上下文过滤返回整个字段【英文标题】:Solr suggest - context filtering with DocumentDictionaryFactory returns entire field 【发布时间】:2018-12-22 06:36:47 【问题描述】:

我正在为一个提供书籍全文搜索的应用程序开发自动完成功能。

我正在尝试配置具有上下文过滤的 Solr (v.7.4.0) 建议器(例如,将结果限制为来自单本书页面的文本)以返回匹配项以提供所提供的查询,但它返回的内容是整个字段

在 solrconfig.xml 中 searchComponent 的定义中,当我使用 FuzzyLookupFactory 时,它可以正常工作(返回单个单词),但是该查找实现不支持上下文过滤。当我切换到 AnalyzingInfixLookupFactory 并结合 DocumentDictionaryFactory 来支持上下文过滤(参见Solr docs)时,我可以返回整个字段。

示例字段值:


   "id":"abc1234",
   "ocrtext":"In choosing Colors for candy, certain qualifications are necessary. First, they must not fade or change"

响应如下查询:

http://127.0.0.1:8983/solr/iiif_suggest?wt=json&q=col&suggest.cfq=456789

我想要的是:


    "responseHeader": 
        "status": 0,
        "QTime": 1
    ,
    "suggest": 
        "iiifSuggester": 
            "col": 
                "numFound": 1,
                "suggestions": [
                    
                        "term": "colors",
                        "weight": 0,
                        "payload": ""
                    ]

但我得到的是:


    "responseHeader": 
        "status": 0,
        "QTime": 1
    ,
    "suggest": 
        "iiifSuggester": 
            "col": 
                "numFound": 1,
                "suggestions": [
                    
                        "term": "In choosing Colors for candy, certain qualifications are necessary. First, they must not fade or change",
                        "weight": 0,
                        "payload": ""
                    ]

这里是相关的 solrconfig.xml 设置:

<searchComponent name="iiif_suggest" class="solr.SuggestComponent">
  <lst name="suggester">
    <str name="name">mySuggester</str>
    <str name="lookupImpl">AnalyzingInfixLookupFactory</str>
    <str name="dictionaryImpl">DocumentDictionaryFactory</str>
    <str name="suggestAnalyzerFieldType">ocrtext_suggest</str>
    <str name="contextField">is_page_of_ssim</str>
    <str name="field">ocrtext</str>
  </lst>
</searchComponent>

这里是 schema.xml 中的字段定义:

<fieldType name="ocrtext_suggest" class="solr.TextField" positionIncrementGap="100">
  <charFilter class="solr.PatternReplaceCharFilterFactory" pattern="[^a-zA-Z0-9]" replacement=" " />
  <analyzer>
    <tokenizer class="solr.StandardTokenizerFactory"/>
    <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt"/>
    <filter class="solr.StandardFilterFactory"/>
    <filter class="solr.LowerCaseFilterFactory"/>
    <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
  </analyzer>
</fieldType>

<field name="ocrtext" type="ocrtext_suggest" indexed="true" stored="true" multiValued="false" />

基本上,ocrtext_suggest 是在默认 Solr textSpell 字段类型定义上建模的。但是,我观察到该字段必须具有 stored="true" 才能返回任何结果。

当我在 Solr GUI 模式浏览​​器中查看 ocrtext 字段的内容并单击加载术语信息时,该字段似乎被标记为单个术语。我不明白 DocumentDictionaryFactory 如何存储完整的字段值。

任何建议将不胜感激!

【问题讨论】:

【参考方案1】:

尝试根据您的要求替换此 &lt;str name="lookupImpl"&gt;FreeTextLookupFactory&lt;/str&gt;

【讨论】:

以上是关于Solr 建议 - 使用 DocumentDictionaryFactory 进行上下文过滤返回整个字段的主要内容,如果未能解决你的问题,请参考以下文章

Solr 建议器近乎实时不可用

Solr 建议最常见的结果而不返回整个短语

如何为多词自动建议配置 solr(4.10)?

Linux 下 Solr的搭建与使用(建议jdk1.8以上)

solr入门之搜索建议的几种实现方式和最终选取实现思路

solr使用教程面试+工作