如果有人可以帮我解决问题,我将不胜感激。我有这个问题:
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>
这有可能吗?
如果您需要其他信息来回答,请在评论中留言。
答案 0 :(得分:0)
看一下WordDelimiterFilterFactory: https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.WordDelimiterFilterFactory
免责声明:我还没有在SOLR设置中使用模糊搜索。
您可能必须小心标记城市名称并将模糊搜索应用于每个令牌。在这种情况下,您的示例“法兰克福”将模糊搜索应用于“am”。请尝试使用括号:(Frankfurt am Main)~
是否能获得预期的结果。
但是,如果是姓名(城市或街道),我不确定你是否应该对它们进行标记。也许将它们存储为一个不区分大小写的令牌并应用模糊搜索,如“Frankfurt am Main”〜(在查询中带引号)实际上就是你需要的。
尽管如此,你应该尝试按照你所描述的方式使它工作。然后查看查询结果。并且(可能并行)设置索引,将城市和街道名称存储为单个标记(具有较低套管和ascii折叠的KeywordTokenizer,例如),并将模糊搜索作为单个术语应用于它们。我猜想结果会更清晰。但最好 - 尝试一下并进行比较。
此外,我建议尝试使用(扩展或不扩展)DisMax处理程序进行输入,甚至无需区分输入端的城市和街道:https://cwiki.apache.org/confluence/display/solr/The+Extended+DisMax+Query+Parser
通过dismax处理程序处理输入,您可以允许用户非常自由地输入搜索词(比如有一个搜索字段,可以按随机顺序和格式输入城市和街道)。