我正在ElasticSearch工作,并试图寻找一个领域内的子字符串。例如-在堆栈溢出中搜索字符串tac。我正在为此使用multimatchquery,但它不起作用。下面是我的代码片段(first\u name是字段名)。
searchString = "*" + searchString.toLowerCase() + "*";
MultiMatchQueryBuilder mqb = new MultiMatchQueryBuilder("irs", first_name);
mqb.type(MultiMatchQueryBuilder.Type.PHRASE);
BoolQueryBuilder searchQuery = boolQuery();
searchQuery.should(mqb);
NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder();
queryBuilder.withQuery(searchQuery);
NativeSearchQuery query = queryBuilder.build();
当我搜索tac时,它不会返回任何结果。当我搜索stack或overflow时,它会返回stack overflow。
所以它寻找精确的字符串。我试过用 MultiMatchQueryBuilder.Type.PHRASE_PREFIX
但它会查找以子字符串开头的短语。它适用于stac或overf之类的字符串,但不适用于tac或tack。
有没有关于如何解决的建议?
1条答案
按热度按时间2sbarzqh1#
macth查询的分析和应用与索引期间应用的分析器相同,我相信您使用的是
standard
analyzer,它生成以下令牌因此寻找
tac
如果不匹配索引中的任何标记,则需要更改分析器,使其匹配查询时间标记和索引时间标记。n-gram标记器可以解决这个问题。
例子
索引Map
索引示例文档
和搜索查询
和搜索结果