我的索引中有这个:"碎牛肉"。
这是我的配置:
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));
一切都像魅力一样。
如果我搜索"碎牛肉",我会得到我的实体。如果我搜索"牛肉地面",将不会返回任何内容。
有人有想法吗?
答案 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)