【问题标题】:Solr: fuzzy operator not changing search resultsSolr:模糊运算符不改变搜索结果
【发布时间】:2013-06-10 19:34:53
【问题描述】:

如果可能的话,我想将我的代码更改限制为仅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,查询都会返回相同的结果。此外,模糊搜索非常宽松,有时会将不相关的文本匹配到特定的facts。是否有另一种方法,通过查询参数或修改schema.xml 文件来纠正问题?其他 stackoverflow 帖子建议使用 ComplexPhraseQueryParser,但我不想将 Java 添加到我的代码库中(无论如何这似乎很难理解)。

【问题讨论】:

    标签: solr django-views fuzzy-search


    【解决方案1】:

    我一直在寻找相同问题的解决方案。在浏览了一些文档和邮件论坛之后,我意识到 solr 中没有内置方法可以直接实现这一点。 虽然这种方法不是一种非常干净和有效的方法,但我是这样解决这个问题的:

    在创建查询副本并向其附加“~”(波浪号)时,请保留不带波浪号的查询副本并将其提升更高。结果的数量保持不变,只有完全匹配的排名更高。

    这是我所知道的通过查询修改实现此目的的唯一方法。如果您找到了其他方法,请分享。

    希望这对您有所帮助。 编辑:

    $searchFields = 'firstName^40 firstName~^20';
    

    我不记得为什么我停止使用它,但从它的外观来看,我想在语法中放置多个这样的字段时存在问题。 现在我使用 edismax 在具有不同权重的多个字段中进行搜索,对于上述问题,我在架构中使用具有不同索引的重复字段。最后根据您的优先级为各个字段名称赋予不同的权重。

    【讨论】:

    • 你能举个例子吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-15
    • 1970-01-01
    • 2013-02-18
    • 2017-08-14
    • 2012-06-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多