问题描述
我是 nest 和 Elastic Search 的新手,虽然我能够使用更基本的查询,但我现在正在尝试解决这个问题:
- 在 firstName 或 lastName 字段中查找用户,对于给定的输入查询,它应该是模糊的,以便您可以处理拼写错误
- 如果提供了城市,则过滤所有匹配项,使其与城市匹配
- 如果还提供了状态,则过滤所有匹配项,使其与状态匹配
- 仅包含字段“isSearchable”为真的人
- 如果提供了城市和州,那么当然两者都匹配
例如,我在索引中有 10 个“John Smiths”。如果我不考虑城市/州,而只搜索“john brown”作为我的术语,或者“john”或“brown”或“jhn brwn”,我希望所有 10 都回来。 如果 John browns 中的一个住在纽约法拉盛,另一个住在佐治亚州法拉盛,而我把“法拉盛”作为城市,那么我希望两个住在法拉盛的人都回来。如果我把“ Flushing”和“New York”然后我希望能得到其中之一。
我尝试了一些不同的东西..这是我制作的构造。请记住,如果我直接在 Elastic Search 中浏览到 URL 并查询 *,它会返回我的记录,如果我执行 _search?q=somename 它会返回匹配项,因此我知道我已设置并编入索引。>
var foundUsers = new List<IndexedUser>();
var filters = new List<Func<QueryContainerDescriptor<IndexedUser>,QueryContainer>>();
//If city was provided,then search on that
if (!String.IsNullOrEmpty(city))
filters.Add(fq => fq.Terms(t => t.Field(f => f.City).Terms(city)));
//If state was provided,then search on that
if (!String.IsNullOrEmpty(state))
filters.Add(fq => fq.Terms(t => t.Field(f => f.State).Terms(state)));
//Ony find users who want to be searched
filters.Add(fq => fq.Terms(t => t.Field(f => f.IsSearchable).Strict(true)));
var results = client.Search<IndexedUser>(x => x.Query(q => q
.Bool(
bq => bq
.Should(
s => s.Match(m => m.Query(term).Field(f => f.FirstName).Boost(1.1).Fuzziness(Fuzziness.Editdistance(1))),s => s.Match(m => m.Query(term).Field(f => f.LastName).Boost(1.1).Fuzziness(Fuzziness.Editdistance(1)))
)
.Filter(filters))
).Index("user")
);
foundUsers = results.Documents.Concat(results.Documents).ToList();
当我运行它时,它崩溃并给出错误:
2020-12-21T04:29:25.4214526+00:00 0HM55D28OUJ5C:00000009 [ERR] ERROR With Search: Query is conditionless but strict is turned on (47081e5a)
我上面的理解可能是因为我对 isSearchable 有严格要求,但是我觉得我在这里需要一些指导才能做到这一点,因为我怀疑我犯了其他一些错误。
非常感谢您抽出宝贵时间!
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)