Indexing SOLR:如何在字段值中使用通配符和问号

Indexing SOLR:如何在字段值中使用通配符和问号,indexing,solr,wildcard,Indexing,Solr,Wildcard,在过去的几天里,我已经阅读了很多页面,但可以找到针对以下情况配置字段分析器的任何示例: -字段值可以同时包含这两个值?和*: abcdef1 ab?de?2 abc?e* -查询也可能包含它: “ab??e*”和“ab*”——因此应解决所有文件 “ab1*”-仅秒。 可以这样配置SOLR吗?在这种情况下,您可能需要创建字段类型并将其应用于字段 您的字段类型应该包括这样的标记器和过滤器,它们将生成标记 您可以在solr wiki页面上的use tokenizer and filter上阅读更多内容

在过去的几天里,我已经阅读了很多页面,但可以找到针对以下情况配置字段分析器的任何示例:
-字段值可以同时包含这两个值?和*:
abcdef1
  • ab?de?2
  • abc?e*
  • -查询也可能包含它:
    “ab??e*”和“ab*”——因此应解决所有文件
  • “ab1*”-仅秒。

  • 可以这样配置SOLR吗?

    在这种情况下,您可能需要创建字段类型并将其应用于字段

    您的字段类型应该包括这样的标记器和过滤器,它们将生成标记

    您可以在solr wiki页面上的use tokenizer and filter上阅读更多内容

    您还可以使用不同的分析器进行索引和查询

    这也取决于您的要求

    我建议你试试下面的字段类型

    您可以在schema.xml中添加以下字段类型。 对要执行部分/通配符搜索的字段使用“部分搜索”字段类型

    完成schema.xml更改后,需要重新启动服务器并重新索引数据

    <fieldType name="partial_search" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="10"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
        </analyzer>
    </fieldType>
    

    在这种情况下,您可能需要创建字段类型并将其应用于字段

    您的字段类型应该包括这样的标记器和过滤器,它们将生成标记

    您可以在solr wiki页面上的use tokenizer and filter上阅读更多内容

    您还可以使用不同的分析器进行索引和查询

    这也取决于您的要求

    我建议你试试下面的字段类型

    您可以在schema.xml中添加以下字段类型。 对要执行部分/通配符搜索的字段使用“部分搜索”字段类型

    完成schema.xml更改后,需要重新启动服务器并重新索引数据

    <fieldType name="partial_search" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
            <tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="10"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.KeywordTokenizerFactory"/>
        </analyzer>
    </fieldType>
    
    
    
    请重新格式化问题正文。很难理解。好的,现在应该更清楚了。请重新格式化问题正文。很难理解。好吧,现在应该更清楚了。不允许使用多个标记器,所以应该如下:
    无论如何,您的方法很好,涵盖了很多变体,除以下内容外:字段=
    ab?de?2
    和查询=
    ab1*
    。还有一个:field=
    ab*
    和query=
    ab1234
    。我认为ab?de?2是不可能实现的。。。由于您无法创建任何此类标记…您仍然可以从您的终端尝试…我建议使用ngram,您可以实现部分或通配符搜索…当您有一个类似“abhijit”的文本时…然后使用上述字段类型,您将创建标记,如ab、abh、abhi、abhij、abhijit、abhijit、bh、bhi、,bhij…等等,如果你查询..bhi..,那么你应该得到abhijit的结果…也许可以使用FuzzySearch?但据我所知,它可以替换所需术语中的任何字符,因此如果我们得到字段
    ab?de?2
    和查询
    zbcdef2
    ,它可以匹配它们,但这是错误的。。。如果可以将FuzzySearch配置为仅从两侧(字段和查询)在
    上启动,则可以解决我的问题。一般来说,我所有的数据都有固定的长度(15个字符),所以我可以用尾随的
    标记替换所有
    *
    。您认为如何?不允许使用多个标记器,因此应该如下所示:
    无论如何,您的方法很好,涵盖了很多变体,除了以下内容:field=
    ab?de?2
    和query=
    ab1*
    。还有一个:field=
    ab*
    和query=
    ab1234
    。我认为ab?de?2是不可能实现的。。。由于您无法创建任何此类标记…您仍然可以从您的终端尝试…我建议使用ngram,您可以实现部分或通配符搜索…当您有一个类似“abhijit”的文本时…然后使用上述字段类型,您将创建标记,如ab、abh、abhi、abhij、abhijit、abhijit、bh、bhi、,bhij…等等,如果你查询..bhi..,那么你应该得到abhijit的结果…也许可以使用FuzzySearch?但据我所知,它可以替换所需术语中的任何字符,因此如果我们得到字段
    ab?de?2
    和查询
    zbcdef2
    ,它可以匹配它们,但这是错误的。。。如果可以将FuzzySearch配置为仅从两侧(字段和查询)在
    上启动,则可以解决我的问题。一般来说,我所有的数据都有固定的长度(15个字符),所以我可以用尾随的
    标记替换所有
    *
    。你觉得怎么样?