0

我的索引中有这个:“碎牛肉”。

这是我的配置:

settings:
    index:
        analysis:
            analyzer:
                index_analyzer:
                    tokenizer: whitespace
                    filter: [lowercase, asciifolding, word_delimiter, snowball]

这就是我搜索的方式:

    $query      = new \Elastica\Query;
    $boolQuery  = new \Elastica\Query\Bool;
    $matchQuery = new \Elastica\Query\Match;
    $filter     = new \Elastica\Filter\Term(array('visible' => 'true'));
    $termQuery  = new \Elastica\Query\Term;

    $termQuery->setTerm('locale_id', $localeId);
    $matchQuery->setFieldQuery('name', $name);
    $matchQuery->setFieldParam('name', 'type', 'phrase_prefix');

    $boolQuery->addMust($termQuery);
    $boolQuery->addMust($matchQuery);

    $query->setQuery($boolQuery);

    $this->finder->findPaginated($query, array('from' => $from, 'size' => $size));

一切都像魅力一样。

如果我搜索“碎牛肉”,我会得到我的实体。如果我搜索“牛肉粉”,则不会返回任何内容。

有人有想法吗?

4

1 回答 1

0

您正在使用短语前缀搜索:

$matchQuery->setFieldParam('name', 'type', 'phrase_prefix');

这将执行一个 match_phrase_prefix 来寻找短语:

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-match-query.html朝向页面底部。

我认为您想要一个布尔搜索(AND 或 OR,默认为 OR)来查找任一术语。或者使用短语搜索,但将 slop 设置为至少 2(但请确保您使用的 ES 版本没有此 slop 错误:https ://github.com/elasticsearch/elasticsearch/issues/5437 )

于 2014-04-17T00:10:23.313 回答