当前位置: 首页 > 知识库问答 >
问题:

用特殊字符搜索solr

司马英才
2023-03-14

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

如何在solr admin中搜索具有该特殊字符(如“-”或“”?)的内容???

问候

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

我的搜索指向“标题”字段。

从模式中摘录。xml:

 ...
 <!-- 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"/>

共有3个答案

段志
2023-03-14

我花了很多时间来完成这件事。这里有一个在SolR中查询特殊字符的明确步骤。希望它能帮助别人。

>

  • 编辑schema.xml文件并找到solr。您正在使用的文本字段。
  • 在这两种情况下,索引和查询分析器会修改WordDlimiterFilterFactory并添加type="characters.txt"类似的内容:

    <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
     <analyzer type="index">
     <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter catenateAll="0" catenateNumbers="0" catenateWords="0" class="solr.WordDelimiterFilterFactory" generateNumberParts="1" generateWordParts="1" splitOnCaseChange="1" types="characters.txt"/>
    </analyzer>
    <analyzer type="query">
    <tokenizer class="solr.WhitespaceTokenizerFactory"/>
    <filter catenateAll="0" catenateNumbers="0" catenateWords="0" class="solr.WordDelimiterFilterFactory" generateNumberParts="1" generateWordParts="1" splitOnCaseChange="1" types="characters.txt"/>
    </analyzer>
    </fieldType>
    

    确保使用WhitespaceTokenizerFactory作为标记器,如上所示。

    你的characters.txt文件可以有这样的条目-

     \# => ALPHA
    @ => ALPHA
    \u0023 => ALPHA
                    ie:- pointing to ALPHA only.
    

    清除数据,重新索引和查询输入的字符。它会起作用的。

  • 冯宪
    2023-03-14

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

    select?q=title:"Titanic - 1999" 
    

    如果你只是想寻找那个特殊的角色,那么你需要逃离它:

    select?q=title:\-
    

    还要检查:特殊字符(-

    如果你确切地知道你不想使用哪些特殊字符,那么你可以把它添加到regex-normalize.xml

    <regex> 
      <pattern>&#x2D;</pattern> 
      <substitution>%2D</substitution> 
    </regex>
    

    这会将所有“-”替换为-,所以当您搜索时,只要您搜索-,而不是“-”,它就可以正常工作

    危寒
    2023-03-14

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

    这里的问题是text_general使用了Standard TokenizerFactory。

     <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=标题:\-在这里不起作用。

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

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

    Solr还有一个名为text\u ws的字段类型。根据您的要求,这可能就足够了。

     类似资料:
    • 要转义这些字符,请在字符前面使用\。例如,要搜索(1+1):2,请使用以下查询: 为此,我使用方法: 我使用经典分析器是因为我注意到标准分析器在转义特殊字符方面存在一些问题。 null

    • 我刚开始使用hibernate lucene搜索。从几天以来,我一直致力于搜索关键字与特殊字符。我正在使用MultiFieldQueryParser进行精确短语匹配以及布尔搜索。但在这个过程中,我无法得到搜索关键字的结果,如“有1年以上的经验”,如果我没有在搜索关键字周围添加任何引号,那么我就得到了结果。所以我在执行lucene查询时观察到的是,它正在转义特殊符号(+)。我正在使用Standard

    • 问题内容: 我无法在Elasticsearch中以特殊字符结尾/开头的字符进行搜索。就像“ 123456!” 我的映射是 它给我错误,我可以在搜索查询(或映射)中做什么,以便特殊字符将被视为搜索字符串的一部分? 问题答案: 由于您的字段是(好!),请尝试用双引号引起来进行完全匹配: 这样做的另一种方法是在查询中设置分析器(但请务必转义,因为它是保留字符(对于操作员)

    • 是否可以通过fullTextQuery找到带有特殊字符的单词?luke的搜索很好地处理了查询,但是from fullTextQuery没有返回任何结果。 不带通配符搜索“C”,不带特殊字符。 如何解决这个问题?

    • 当我搜索“#”等特殊字符时,没有结果出现。 请注意,我已经转义了查询字符串。 然而,当与“c#”这样的字母组合时,Lucene找到了这个词。 有没有办法搜索单个特殊字符? 这是我的片段:

    • 问题内容: 我正在支持一个Java应用程序,该应用程序具有一个与关键字匹配的搜索栏,并从缓存中获取结果。 该应用程序在Tomcat中运行,并且也具有Apache Web服务器。 搜索 aaa时 出现问题, “ 特殊字符 ” 导致了问题,我进入 禁止您无权访问/xx/xx/xxxx.jsp 由于没有Web服务器,因此可以在本地设置中进行搜索。如我所见,一些帖子暗示该问题可能是由Web服务器配置引起的