【问题标题】:Tune solr phrase query search调整 solr 短语查询搜索
【发布时间】:2015-11-11 20:45:59
【问题描述】:

我们正在尝试调整 DSE 搜索中的短语查询。 例如,如果我们的列名 X 的值为“D A T A S T A X”,我们正在搜索 X 的完全匹配:“T A S T”

使用 whitespacetokenizer 对单词进行标记。

我们在数据库中有几亿条记录,所有索引都是内存(我们使用 pcstat 进行了测试)。然而,查询仍然需要 5-15 秒。如果所有索引都在内存中,为什么要花这么多时间来提取结果?我该如何调整这个?

感谢任何帮助。

【问题讨论】:

  • 值“D A T A S T A X”包含字符之间的空白。真实的数据也包含相同的吗?因为 whitespacetokenizer 会将其拆分为单独的字符。还有一件事,您是否搜索完全匹配的子字符串,这个子字符串可能是可变长度的。您能否从您的 solrconfig.xml 中提供 filterCache、queryCache 和 documentCache 的详细信息?
  • 是的,你是对的,我正在搜索确切的子字符串,真实数据包含相同的模式,字符之间有空格。子字符串可以是任意长度。 , 。我们不想依赖缓存,因为我们的查询不会重复。我们希望我们的查询在第一次运行时表现良好。
  • 因为您的数据由 WhitespaceTokenizer 标记。鉴于数据的性质,查询和索引阶段会将单词分解为单个字符。请检查:wiki.apache.org/solr/…
  • 其他方式可能是,您使用关键字标记器对数据进行标记,因为它会将相同的单词传递给过滤器。然后应用具有最大和最小克大小的 Edge N-Gram 过滤器。您能详细介绍一下数据吗?
  • 是的,我明白了。这就是我搜索确切子字符串的原因。如果做错了如何在我的情况下搜索确切的子字符串?我已经尝试过 edgengram 和 ngram。他们对我帮助不大。

标签: search solr datastax datastax-enterprise


【解决方案1】:

试试这个字段类型:

<fieldType name="custom_edge_ngram" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.PatternReplaceFilterFactory" pattern="([^A-Za-z0-9])" replacement="" replace="all"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="15"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.PatternReplaceFilterFactory" pattern="([^A-Za-z0-9])" replacement="" replace="all"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

这里 KeywordTokenizerFactory 分词器会将文本流准确地传递给过滤器。 PatternReplaceFilterFactory 将删除除字符和数字之外的所有内容。您可以根据需要进行配置。然后我们将流小写并生成 NGram。这是针对索引阶段的。对于查询阶段,我们不执行 NGram,因为我们想匹配确切的子字符串。

我们将使用 NGram 而不是 EdgeNGram,因为这将提供子字符串。 EdgeNGram 始终包含从开始或结束。所以 EdgeNGram 在这种情况下没有帮助。

希望这会有所帮助。

【讨论】:

  • 如何运行查询? X:"TAST" 或 X:"TAST"。从后面生成边图比前面有用吗?
  • 您使用的是什么 solr 版本? EdgeNGramFilterFactory 在 solr 4 和 solr 5 中有不同的行为。
  • 感谢您的帮助。我会测试它。如何运行查询? X:"TAST" 或 X:"TAST"
  • 您可以查询任何内容。 X:“TAST”或X:“T A S T”。两者都可以。因为我们用空替换所有的空格。我已经在 solr 分析工具中进行了测试。试试同样的方法。
  • 现在查询响应时间下降到 1-2 秒,但我们的索引大小几乎翻了一番,仅对于 180G 的数据,我们就有 120G 的索引大小。我看到你的另一篇文章来减少索引大小,但我们仍然有 ngrams 的大索引。 stackoverflow.com/questions/32009475/…
猜你喜欢
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多