Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何配置SOLR以处理类似的搜索关键字:`ABCWord`、`abc word`?_Solr - Fatal编程技术网

如何配置SOLR以处理类似的搜索关键字:`ABCWord`、`abc word`?

如何配置SOLR以处理类似的搜索关键字:`ABCWord`、`abc word`?,solr,Solr,我有两种标题类型的内容:ABCWord和ABCWord。当我在搜索框中输入诸如:abc word之类的关键字时,会找到名为abc word的abc word内容,但我还需要获得名为abc word的内容 我尝试过使用:solr.EdgeNGramFilterFactory和solr.WordDelimiterFilterFactory,但似乎我用错了 我的当前schema.xml文本字段配置: <fieldType name="text" class="solr.TextField" po

我有两种标题类型的内容:ABCWord和ABCWord。当我在搜索框中输入诸如:abc word之类的关键字时,会找到名为abc word的abc word内容,但我还需要获得名为abc word的内容

我尝试过使用:solr.EdgeNGramFilterFactory和solr.WordDelimiterFilterFactory,但似乎我用错了

我的当前schema.xml文本字段配置:

<fieldType name="text" class="solr.TextField" positionIncrementGap="100">
      <analyzer type="index">
        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <!-- in this example, we will only use synonyms at query time
        <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
        -->
        <!-- Case insensitive stop word removal.
          add enablePositionIncrements=true in both the index and query
          analyzers to leave a 'gap' for more accurate phrase queries.
        -->
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="stopwords.txt"
                enablePositionIncrements="true"
                />
        <filter class="solr.WordDelimiterFilterFactory"
                protected="protwords.txt"
                generateWordParts="1"
                generateNumberParts="1"
                catenateWords="1"
                catenateNumbers="1"
                catenateAll="0"
                splitOnCaseChange="0"
                preserveOriginal="1"/>
        <filter class="solr.LengthFilterFactory" min="2" max="100" />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="30" side="front"/>
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="30" side="back"/>
      </analyzer>
      <analyzer type="query">
        <charFilter class="solr.MappingCharFilterFactory" mapping="mapping-ISOLatin1Accent.txt"/>
        <tokenizer class="solr.WhitespaceTokenizerFactory"/>
        <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
        <filter class="solr.StopFilterFactory"
                ignoreCase="true"
                words="stopwords.txt"
                enablePositionIncrements="true"
                />
        <filter class="solr.WordDelimiterFilterFactory"
                protected="protwords.txt"
                generateWordParts="1"
                generateNumberParts="1"
                catenateWords="0"
                catenateNumbers="0"
                catenateAll="0"
                splitOnCaseChange="0"
                preserveOriginal="1"/>
        <filter class="solr.LengthFilterFactory" min="2" max="100" />
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
        <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="30" side="front"/>
        <filter class="solr.EdgeNGramFilterFactory" minGramSize="3" maxGramSize="30" side="back"/>
      </analyzer>
    </fieldType>

您并没有使用错误,但可能您使用了太多的过滤器,影响了最终结果。 EdgeGram应该可以解决您的问题,因为它会在您的输入中创建大小为3到30的令牌。因此,ABCWord将变成abc、abcw、abcwo、abcwor和ABCWord,然后对abc的搜索应该匹配

首先,我建议您在使用ngram时更改正在使用的字段类型,因为它会大大增加索引大小。最好创建一个新的字段类型,仅在您真正需要的字段中使用,而不是在不需要Ngram的地方创建可能索引其他值的文本字段类型

其次,如果您的analyzer定义的索引和搜索时间可以相同,则不需要复制配置,只需使用“analyzer”而不是“analyzer type=index”和“analyzer type=query”

我强烈建议您检查solr管理员中的“分析”选项卡,以了解solr如何为您的输入处理索引和查询的文本。当您试图获得某些特定结果时,还可以删除fieldType配置中的一些过滤器。最好了解每个过滤器对输入的作用