1

我希望能够自动完成名称。

例如,如果我们有 name ,John Smith我希望能够搜索Jo并获取文档。SmJohn Sm

另外,我不想jo sm匹配文件。

我目前有这个分析仪:

return array(
    'settings' => array(
        'index' => array(
            'analysis' => array(
                'analyzer' => array(
                    'autocomplete' => array(
                        'tokenizer' => 'autocompleteEngram',
                        'filter' => array('lowercase', 'whitespace')
                    )
                ),

                'tokenizer' => array(
                    'autocompleteEngram' => array(
                        'type' => 'edgeNGram',
                        'min_gram' => 1,
                        'max_gram' => 50
                    )
                )
            )   
        )
    )
);

这样做的问题是,首先我们将文本拆分,然后使用边图进行标记。

这导致: j jo joh john s sm smi smit smith

这意味着,如果我搜索john smithor john sm,则不会返回任何内容。

所以,我需要生成如下所示的令牌 j jo joh john s sm smi smit smith john s john sm john smi john smit john smith

如何设置我的分析器以便生成这些额外的令牌?

4

1 回答 1

4

我最终没有使用边缘图。

standard我使用标记器standardlowercase过滤器创建了一个分析器。这实际上与standard分析器相同,但没有任何停用词过滤器(毕竟我们正在搜索名称,并且可能有人打电话TheAn等等)。

然后我将上述分析器设置为index_analyzer和。将此设置与查询一起使用效果非常好。simplesearch_analyzermatch_phrase_prefix

这是我使用的自定义分析器(称为自动完成并用 PHP 表示):

'autocomplete' => array(
                        'tokenizer' => 'standard',
                        'filter' => array('standard', 'lowercase')
                ),
于 2013-06-10T07:10:55.350 回答