【问题标题】:Solr treats whitespace and other special tags in query like "OR"Solr 在查询中处理空格和其他特殊标签,如“OR”
【发布时间】:2013-12-22 20:15:02
【问题描述】:

我有一个具有以下定义的文本字段:

<fieldType name="myTextField" class="solr.TextField" positionIncrementGap="100">
            <analyzer type="index">
                <tokenizer class="solr.StandardTokenizerFactory"/>
                <filter class="solr.LowerCaseFilterFactory"/>
                <filter class="solr.NGramFilterFactory" minGramSize="1"
                        maxGramSize="40"/>

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

现在,我有一个包含此文本的字段: "嗨,这是一个关于 solr 的问题"

还有另一个包含此文本的字段: "aaa solr bbb"

当我的查询字符串是“关于 solr”时,我得到了两个字段作为结果,尽管我只想要第一个字段,因为它是唯一一个包含所有字符(包括空格)的字段。 这不仅发生在空格上,还发生在其他特殊字符上,例如“:”。 用括号搜索(关于 solr)没有帮助。

注意:我在搜索之前转义了我的字符串:

String s1 = ClientUtils.escapeQueryChars(s);

有什么建议吗?

【问题讨论】:

    标签: solr tokenize


    【解决方案1】:

    这是 Solr 的预期行为。你需要使用 about AND solr 来获得你想要的行为。默认值为 OR。如果你想改变这种行为,你可以通过使用 q.op 参数作为 q.op=AND 来做到这一点,那么 about solr 将按照你的期望进行处理。但是,将 OR 更改为 AND 并不是一个好主意,因为通常假定 OR,因此更改它不是一个好主意。而是将您的查询更改为 AND。

    标准分析器会在空格和特殊字符处打断您的短语。没有这样的列表,任何非字母数字字符都会变成空格。

    在此处阅读有关分析器的更多信息:http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters

    更新: StandardTokenizerFactory 中断的字符例如是 &,。 ,- 等等。所以这句话:“我和我的狗去散步了。狗追着一只玩具松鼠。”将被分析为 => 我我的狗去散步了狗追了一只玩具松鼠。

    如果您只想在空白处中断,请使用:WhitespaceTokenizerFactory

    更新: WhitespaceTokenizerFactory 中断的字符是空格和换行符。所以这句话:“我和我的狗去散步了。狗追了一只玩具松鼠。”将被分析为 => [Me] [&] [my] [Dog] [went] [for] [a] [walk.] [The] [dog] [chased] [a] [toy-squirrel.]。

    【讨论】:

    • 你能说得更具体点吗?我应该在哪里使用 AND?谢谢!
    • 更新了我的答案。发布您的查询,以便我可以进一步更新我的答案。
    • 除了空格之外,还有哪些其他字符可以将文本分解为短语?我没有找到这样的列表
    • 他们遵守 Unicode 标准,见这里unicode.org/reports/tr29/#Word_Boundaries
    • 谢谢!但是没有办法以某种方式定义 fieldType 以便这些字符会定期为该字段编制索引并且不会将文本分成短语?
    【解决方案2】:

    您可以使用 solr 短语查询。您的查询语法将如下所示:

    String query = "\"about solr\"";
    

    然后它将匹配您需要的字段。

    您当前的查询被解释为:

    String query = "about OR solr";
    

    所以它将匹配两个字段,这背后的原因是 solr 查询解析器默认操作符是“OR”。检查您的 schema.xml 文件是否包含以下条目:

    <solrQueryParser defaultOperator="OR"/>
    

    希望这能消除您的疑虑。

    更多详情请参考以下链接:

    http://www.solrtutorial.com/solr-query-syntax.html

    http://www.solrtutorial.com/schema-xml.html

    【讨论】:

    • 谢谢。我可以以某种方式覆盖某个字段类型的 defaultOperator 吗?除了空白之外,其他“条形字符”是什么?
    • 我想知道是否有一种方法可以定义字段类型,以便像空格一样的“条形字符”将像常规字符一样被索引
    • @axelrod 默认运算符适用于所有字段,因此您不能为某些字段覆盖它。我不确定,但我认为在这种情况下所有非字母数字字符都是条形字符。
    • @axelrod 为您可以使用“字符串”字段类型的所有字符编制索引,因此您的字段值不会在此字段类型中标记化,而是按原样编制索引。
    • 但是我在这个字段中索引整个文本文件。字符串字段没有长度限制吗?我也不需要全场匹配。
    猜你喜欢
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-12
    • 1970-01-01
    • 2015-09-01
    • 1970-01-01
    相关资源
    最近更新 更多