我们正在尝试在DSE搜索中调整我们的短语查询。 例如,如果我们有列名X,其值为" D A T A S T A X"我们正在寻找X的完全匹配:" T A S T"
使用whitespacetokenizer对单词进行标记。
我们在数据库中有几百万条记录,所有索引都是内存(我们使用pcstat测试)。但是查询仍需要5-15秒。如果所有索引都在内存中,为什么要花时间来提取结果呢?我该怎么调整呢?
感谢任何帮助。
答案 0 :(得分:1)
试试这个fieldType:
<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 tokenizeer将文本流精确传递给过滤器。 PatternReplaceFilterFactory将删除除字符和数字之外的所有字符。你可以随意配置它。然后我们小写流并生成NGram。这是针对索引阶段的。对于查询阶段,我们不执行NGram,因为我们想要匹配确切的子字符串。
我们将使用NGram而不是EdgeNGram,因为这将提供子字符串。 EdgeNGram始终包含从开始或结束。所以EdgeNGram在这种情况下没有帮助。
希望这有帮助。