【问题标题】:Fuzzy search a part of the whole text in Solr在 Solr 中模糊搜索整个文本的一部分
【发布时间】:2020-07-10 19:17:07
【问题描述】:

我的 Solr 索引有以下字段声明:

<field name="description" type="text_ci" indexed="true" multiValued="false" required="true"/>

字段类型:

<fieldType name="text_ci" class="solr.TextField" omitNorms="true" sortMissingLast="true">
    <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType> 

在这个索引中,我有文档,其中描述值类似于“{city} 中的住宿”(它们都有不同的城市)

我想进行模糊搜索,例如当我输入拼写错误的*acomodation*~2 以获得结果时,但我觉得这很困难,因为“住宿”只是文本的一部分。

我正在考虑使用 NGramFilter 来标记输入,但我不确定这是否是正确的方法以及如何实现它。

你知道我能做什么吗?

【问题讨论】:

    标签: solr wildcard fuzzy-search


    【解决方案1】:

    Lucene 支持基于 Levenshtein 距离或编辑距离算法的模糊搜索。要进行模糊搜索,请在单个单词 Term 的末尾使用波浪号 "~"

    我认为这里不需要 NGramFilter。

    ~ 运算符用于运行模糊搜索。 您需要在每个术语后添加~ 运算符,还可以指定编辑距离,后面是可选的,如下所示。

    {FIELD_NAME:TERM_1~{Edit_Distance}
    

    您的请求将如下所示。

    http://localhost:8983/solr/FuzzySearchExample/select?indent=on&q=desc:Samsu~&wt=json&fl=id,desc
    

    我的字段类型如下。

    <fieldType name="text_ci" class="solr.TextField" omitNorms="true" sortMissingLast="true">
        <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <filter class="solr.LowerCaseFilterFactory"/>
        </analyzer>
    </fieldType>
    

    我收到acomodation~2acomodation~1 的以下回复

    我收到了acomodation 的以下回复。

    【讨论】:

    • 但我还需要通配符,因为如果我像这样输入“description: acomodation~2”这样的查询,我不会得到任何命中。
    • 这是因为 KeywordTokenizer 将整个输入保存为单个标记。如果您希望每个单词都可搜索,请使用不同的分词器 - 例如 StandardTokenizer
    • 尝试将文本一般作为字段类型应用于您的字段
    • 也许我做错了什么,但 StandardTokenizer 也不起作用。
    • 成功了。我必须进行完全导入才能更新数据。谢谢大佬。
    猜你喜欢
    • 2013-05-15
    • 2016-08-21
    • 1970-01-01
    • 2013-02-18
    • 1970-01-01
    • 2012-12-25
    • 2013-01-21
    • 2012-06-08
    • 1970-01-01
    相关资源
    最近更新 更多