我的db集合中有两个用户,这些名称是john
和john-son
,现在我正在尝试在db collection的所有字段中选择与我的搜索文本匹配的所有记录。例如,我的搜索文本是john
,那么我的查询是使用elasticsearch java api
QueryBuilder queryBuilderForUserSearch = QueryBuilders.must(
QueryBuilders.fieldQuery("_all", "*" + q + "*"));
工作正常。但是当我尝试使用像john-son
这样的特殊字符文本进行搜索时,它会返回零记录。任何人都可以帮助我为什么会这样,请提供有特殊字符的选择文本的查询。
答案 0 :(得分:1)
您遇到的问题与此问题大致相同:Elasticsearch wildcard search on not_analyzed field
首先,您真的不希望在查询中使用前导通配符。 Lucene必须遍历索引词典中的每个术语才能找到术语。这是术语数量的O(n),这非常昂贵。有关详细信息,请参阅此文章:http://www.found.no/foundation/elasticsearch-from-the-bottom-up/
这里可能发生的事情是john-son
通过john
- 分析器标记为son
和standard
。因此,字典中没有john-son
项用于匹配的通配符查询。