首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在solr中使用特殊字符进行搜索

在solr中使用特殊字符进行搜索
EN

Stack Overflow用户
提问于 2013-08-16 16:04:00
回答 3查看 23.4K关注 0票数 8

我对solr中特殊字符的搜索有问题。我的文档有一个字段“标题”,有时它可以像“泰坦尼克号- 1999”(它有字符"-")。当我试图用"-“在solr中搜索时,我会收到一个400错误。我试图逃避这个角色,所以我尝试了"-“和"-”之类的东西。使用这些更改,solr不会用错误来响应我,但是它返回0结果。

如何在solr管理员中搜索该特殊字符(类似于"-“或”“?)

问候

更新在这里您可以看到我当前的solr方案https://gist.github.com/cpalomaresbazuca/6269375

我搜索的是字段“标题”。

摘录自schema.xml:

代码语言:javascript
复制
 ...
 <!-- A general text field that has reasonable, generic
     cross-language defaults: it tokenizes with StandardTokenizer,
     removes stop words from case-insensitive "stopwords.txt"
     (empty by default), and down cases.  At query time only, it
     also applies synonyms. -->
    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
            <!-- in this example, we will only use synonyms at query time
             <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
             -->
            <filter class="solr.LowerCaseFilterFactory"/>

        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.LowerCaseFilterFactory"/>

        </analyzer>
    </fieldType>
...
<field name="Title" type="text_general" indexed="true" stored="true"/>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-03-02 18:20:02

您正在使用标准的text_general字段作为标题属性。这可能不是一个好的选择。text_general指的是大量的文本(或至少是句子),而不是名称或标题的精确匹配。

这里的问题是text_general使用StandardTokenizerFactory

代码语言:javascript
复制
 <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
            <!-- in this example, we will only use synonyms at query time
             <filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
             -->
            <filter class="solr.LowerCaseFilterFactory"/>
        
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.StandardTokenizerFactory"/>
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
            <filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
            <filter class="solr.LowerCaseFilterFactory"/>
            
        </analyzer>
    </fieldType>

StandardTokenizerFactory做了以下工作:

一个很好的通用标记器,它剥离了许多无关字符,并将令牌类型设置为有意义的值。令牌类型仅适用于对同一令牌类型具有类型感知的后续令牌筛选器。

--这意味着'-‘字符将被完全忽略,并用于标记字符串.

“孔夫子”将分为“孔”和“福”两种。“-”消失了。

这也解释了为什么select?q=title:\-不能在这里工作。

选择一种更好的拟合字段类型:

而不是StandardTokenizerFactory,您可以使用solr.WhitespaceTokenizerFactory,它只在空格上拆分,以实现单词的精确匹配。因此,为title属性创建您自己的字段类型将是一个解决方案。

Solr还有一个名为text_ws的字段类型。根据您的需求,这可能就足够了。

票数 10
EN

Stack Overflow用户

发布于 2013-08-19 14:23:09

要搜索你的确切短语,在它周围加上引号:

代码语言:javascript
复制
select?q=title:"Titanic - 1999" 

如果您只想搜索这个特殊字符,那么您需要转义它:

代码语言:javascript
复制
select?q=title:\-

也请检查:特殊字符(-&+等)在SOLR查询中不工作

如果您确切地知道您不想使用哪些特殊字符,那么可以将其添加到regex-Norize.xml中。

代码语言:javascript
复制
<regex> 
  <pattern>&#x2D;</pattern> 
  <substitution>%2D</substitution> 
</regex>

这将将所有"-“替换为%2D,因此,当您搜索时,只要搜索%2D而不是"-”,它就会正常工作。

票数 1
EN

Stack Overflow用户

发布于 2016-07-27 07:51:45

我花了很多时间来完成这件事。以下是SolR中查询特殊字符的一步一步的明确步骤。希望它能帮到别人。

  1. 编辑schema.xml文件并找到正在使用的solr.TextField。
  2. 在这两种情况下,“索引”和“查询”分析器都会修改WordDelimiterFilterFactory并添加types="characters.txt",如下所示:
  3. 确保您使用WhitespaceTokenizerFactory作为令牌,如上面所示。
  4. 您的characters.txt文件可以有类似- # =>阿尔法@ =>阿尔法\u 0023 =>阿尔法ie:-指向阿尔法。
  5. 清除输入字符的数据、重新索引和查询。看起来不错。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18277609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档