search - 调solr短语查询搜索

标签 search solr datastax datastax-enterprise

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

单词是用 whitespacetokenizer 标记的。

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

感谢任何帮助。

最佳答案

enter image description here

试试这个字段类型:

<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 在这种情况下没有帮助。

希望这对您有所帮助。

关于search - 调solr短语查询搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32080461/

相关文章:

c++ - 查找字符串是否包含字符串 vector 的任何一个元素的最佳方法

java - 使用 Schemaless Collection 进行错误的 Java 到 Solr 类型映射

elasticsearch - 如何在cassandra上安装搜索引擎?

android - 仅应用程序身份验证 twitter api android

c# - 按相关性/排名对搜索结果进行排序

solr - 使用 Solr 1.4 进行通配符搜索和突出显示

com.datastax.oss -> java-driver-core 和 com.datastax.cassandra -> cassandra-driver-core 之间的 Cassandra 区别

cassandra - 插入特殊字符

Datastax 代理偶尔无法报告指标

python - 在 Django 中使用 HayStack + Solr 进行高级搜索?