Solr滤波器查询中的模糊问题

时间:2015-05-12 08:47:39

标签: performance solr

如果有人可以帮我解决问题,我将不胜感激。我有这个问题:

select?q=city:Frankfurt am Main~&fq=street:Gerhart-Hauptmann-Str.~

这对我不起作用。我想使用模糊搜索来捕获一些用户输入错误。

这就是我想要的:

    应使用模糊搜索在字段Frankfurt am Main中完全搜索
  • city 应使用模糊搜索将
  • Gerhart-Hauptmann-Str.转换为三个术语。

我实际得到的调试输出:

"debug": {
    "rawquerystring": "city:Frankfurt am Main~",
    "querystring": "city:Frankfurt am Main~",
    "parsedquery": city:frankfurt text:am text:Main~2",
    "parsedquery_toString": "city:frankfurt text:am text:Main~2",
    "explain": {...},
    "QParser": "LuceneQParser",
    "filter_queries": [
      "street:Gerhart-Hauptmann-Str.~"
    ],
    "parsed_filter_queries": [
      "street:gerhart-hauptmann-str.~2"
    ],

我(想)我想要这个输出:

 "debug": {
        "rawquerystring": "city:Frankfurt am Main~",
        "querystring": "city:Frankfurt am Main~",
        "parsedquery": city:frankfurt~2 city:am~2 text:Main~2",
        "parsedquery_toString": "city:frankfurt~2 city:am~2 text:Main~2",
        "explain": {...},
        "QParser": "LuceneQParser",
        "filter_queries": [
          "street:Gerhart-Hauptmann-Str.~"
        ],
        "parsed_filter_queries": [
         # My analyser converts Str. to strasse
          "street:gerhart~2 street:hauptmann~2 strasse~2"
        ],

schema.xml

中字段的定义
<field name="city" type="admin_name" indexed="true" stored="true" />
<field name="street" type="street_name" indexed="true" stored="true" multiValued="false"/>

<fieldType name="admin_name" class="solr.TextField" >
       <analyzer>         
          <tokenizer class="solr.StandardTokenizerFactory"/>          
          <filter class="solr.LowerCaseFilterFactory" />
          <filter class="solr.SynonymFilterFactory" synonyms="lang/synonyms_de_admin.txt"/>       
          <filter class="solr.ASCIIFoldingFilterFactory"/>
       </analyzer>   
    </fieldType>

    <fieldType name="street_name" class="solr.TextField" >
       <analyzer>         
          <tokenizer class="solr.StandardTokenizerFactory"/>          
          <filter class="solr.LowerCaseFilterFactory" />
          <!-- The StartEndSynonymFilter replaces synonyms which 
               are at the start or the end of an term. The types
               START_SYNONYM or END_SYNONYM will be set. -->          
          <filter class="my.StartEndSynonymFilterFactory" synonyms="lang/synonyms_de_street.txt"/>        
          <filter class="solr.ASCIIFoldingFilterFactory"/>
       </analyzer>   
    </fieldType>

这有可能吗?

如果您需要其他信息来回答,请在评论中留言。

1 个答案:

答案 0 :(得分:0)

  1. 对连字符进行标记
  2. 看一下WordDelimiterFilterFactory: https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.WordDelimiterFilterFactory

    1. 将模糊应用于每个单词
    2. 免责声明:我还没有在SOLR设置中使用模糊搜索。

      您可能必须小心标记城市名称并将模糊搜索应用于每个令牌。在这种情况下,您的示例“法兰克福”将模糊搜索应用于“am”。请尝试使用括号:(Frankfurt am Main)~是否能获得预期的结果。

      但是,如果是姓名(城市或街道),我不确定你是否应该对它们进行标记。也许将它们存储为一个不区分大小写的令牌并应用模糊搜索,如“Frankfurt am Main”〜(在查询中带引号)实际上就是你需要的。

      尽管如此,你应该尝试按照你所描述的方式使它工作。然后查看查询结果。并且(可能并行)设置索引,将城市和街道名称存储为单个标记(具有较低套管和ascii折叠的KeywordTokenizer,例如),并将模糊搜索作为单个术语应用于它们。我猜想结果会更清晰。但最好 - 尝试一下并进行比较。

      此外,我建议尝试使用(扩展或不扩展)DisMax处理程序进行输入,甚至无需区分输入端的城市和街道:https://cwiki.apache.org/confluence/display/solr/The+Extended+DisMax+Query+Parser

      通过dismax处理程序处理输入,您可以允许用户非常自由地输入搜索词(比如有一个搜索字段,可以按随机顺序和格式输入城市和街道)。