FOS ElasticSearch以不同的顺序搜索令牌

时间:2014-04-15 09:38:18

标签: symfony filter elasticsearch tokenize elastica

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

这是我的配置:

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));

一切都像魅力一样。

如果我搜索"碎牛肉",我会得到我的实体。如果我搜索"牛肉地面",将不会返回任何内容。

有人有想法吗?

1 个答案:

答案 0 :(得分:0)

您正在使用phrase_prefix搜索:

$ 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(但要确定你使用的是没有这个slop bug的ES版本:https://github.com/elasticsearch/elasticsearch/issues/5437