Performance Solr过滤查询中的模糊问题

Performance Solr过滤查询中的模糊问题,performance,solr,Performance,Solr,如果有人能帮我解决问题,我将不胜感激。我有一个疑问: select?q=city:Frankfurt am Main~&fq=street:Gerhart-Hauptmann-Str.~ 这对我不起作用。我想使用模糊搜索来捕捉一些用户输入错误 以下是我想要的: Frankfurt am Main应在city字段中使用模糊搜索进行完全搜索 Gerhart-Hauptmann-Str.应通过模糊搜索转换为三个术语 调试我实际得到的结果: "debug": { "rawquery

如果有人能帮我解决问题,我将不胜感激。我有一个疑问:

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>

这有可能吗

如果您需要更多信息来回答,请在评论中留下提示

  • 连字符标记化
  • 请查看WordDelimiterFilterFactory:

  • 对每一项应用模糊数学
  • 免责声明:我尚未在SOLR设置中使用模糊搜索

    您可能必须小心标记城市名称,并对每个标记应用模糊搜索。您的示例“Frankfurt am Main”在本例中也将对“am”应用模糊搜索。请尝试使用括号:
    (法兰克福美茵河畔)~
    这是否能达到预期效果

    然而,对于名称(城市或街道),我不确定您是否应该标记它们。也许将它们存储为一个不区分大小写的标记,并应用模糊搜索,如“Frankfurt am Main”~(在查询中使用引号),这才是您真正需要的

    然而,你应该试着让它以你描述的方式工作。然后查看查询结果。并且(可能同时)设置一个索引,将城市和街道名称存储为单个标记(例如,小写和ascii折叠的关键字标记器),并将模糊搜索作为单个术语应用于它们。我想结果会更清晰。但最好的方法是尝试并比较

    此外,我建议在输入端试用(扩展或非扩展)Demax处理程序,而不必区分城市和街道:


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

    从schema.xml中查看“city”和“street”的字段设置会很有帮助。如果术语未在连字符上标记,则您的设置中可能缺少analyzer/tokenizer。对于q参数-您是否尝试过在“Frankfurt am Main”周围使用括号?@Risadinha I添加了字段定义。对于q参数-如果我添加括号,我会得到一个错误:{“msg”:“org.apache.solr.search.SyntaxError:无法解析'admin5:(Frankfurt am Main)~':遇到\“\”~“\”…,“代码”:400我认为Demax处理程序对我不起作用。我必须建议匹配的质量,我通过在我的客户机(使用Solrj)中按字段计算输入和输出之间的Levenshtein距离来做到这一点。我将尝试您的其他建议并给出反馈。感谢您的回答:-)