如果可能的话,我想将我的代码更改限制为schema.xml
和其他配置文件。我在schema.xml
:
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="title" type="text_general" indexed="true" stored="true"/>
<field name="fact" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="body" type="text_exact_fuzzy" indexed="true" stored="true"/>
<copyField source="title" dest="text"/>
<copyField source="body" dest="text"/>
我之后在schema.xml
中定义了text_exact_fuzzy,如下所示:
<text_exact_fuzzy: field type for fuzzy matching -->
<fieldType name="text_exact_fuzzy" class="solr.TextField" omitNorms="false">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StandardFilterFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<!--
<filter class="solr.PorterStemFilterFactory"/>
-->
<filter class="solr.PhoneticFilterFactory" encoder="DoubleMetaphone" inject="true"/>
</analyzer>
</fieldType>
当我在Django视图中进行查询时,我使用以下代码(它接受查询并将波形符号(例如~0.8)附加到查询中每个单词的末尾):
fuzzy_clean_text = re.sub(r'\s', '~' + str(fuzzy_index) + ' ', clean_text + ' ')
#return fuzzy_clean_text
post_params = [('q', re.escape(json.dumps(fuzzy_clean_text))),
('wt','json'),
('fl', 'fact'),
# I've tried the query with and without the following parameter:
#('spellcheck.collate', 'true'),
]
result = urllib2.urlopen(solr_server_url, urllib.urlencode(post_params))
response = json.loads(result.read())
但是,无论我如何设置fuzzy_index
,查询都会返回相同的结果。此外,模糊搜索非常宽松,有时将不相关的文本与特定fact
匹配。是否有另一种方法,通过查询参数或修改schema.xml
文件来纠正问题?其他stackoverflow帖子提示ComplexPhraseQueryParser
,但我不想将Java添加到我的代码库中(无论如何它似乎很难理解)。
答案 0 :(得分:0)
我一直在寻找同样问题的解决方案。经过几个文档和邮件论坛后,我意识到solr中没有内置的方法来直接实现这一点。 虽然这种方法不是一个非常干净和有效的方法,但这就是我解决这个问题的方法:
在创建查询的副本并向其添加&#39;〜&#39;(代字号)时,保留查询的副本而不使用代字号并将其提高。结果数量保持不变,只有完全匹配的排名更高。
这是我知道通过查询修改实现此目的的唯一方法。如果您找到了另一种方法,请分享。
希望这有帮助。 编辑:
$searchFields = 'firstName^40 firstName~^20';
我怎么能记住为什么我停止使用它,但从它的外观来看,我想在语法中放置这样的多个字段时会出现问题。 现在我使用edismax在不同权重的多个字段中进行搜索,对于上述问题,我使用模式中具有不同索引的重复字段。最后根据您的优先级为相应的字段名称赋予不同的权重。