c# - 带有条件过滤器的 Nest 中的模糊弹性搜索查询
问题描述
我是 NESt 和 Elastic Search 的新手,虽然我能够使用更基本的查询,但我现在正在尝试解决这个问题:
- 对于给定的输入查询,在 firstName 或 lastName 字段上查找用户,它应该是模糊的,以便您可以处理拼写错误
- 如果提供了城市,则过滤任何匹配项,使其与城市匹配
- 如果还提供了状态,则过滤任何命中,以便它们与状态匹配
- 仅包括字段“isSearchable”为真的人
- 如果提供了城市和州,则两者都匹配
例如,我在索引中有 10 个“John Smiths”。如果我省略了城市/州,只搜索“john brown”作为我的术语,或者“john”或“brown”或“jhn brwn”,我希望所有 10 个都回来。如果其中一个约翰·布朗住在纽约法拉盛,另一个住在乔治亚州法拉盛,我把“法拉盛”作为城市,那么我希望两个住在法拉盛的人都回来。如果我把“法拉盛”和“纽约”,那么我希望能回到其中一个。
我正在尝试一些不同的事情..这是我制作的构造。请记住,如果我直接在 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 有严格的要求,但是我觉得我需要一些指导才能做到这一点,因为我怀疑我犯了其他一些错误。
非常感谢您的宝贵时间!
解决方案
推荐阅读
- java - 当有空格字符时,将句子转换为 ASCII 的代码不起作用
- javascript - 如何用同一对象javascript的另一个值更改值
- python - CSV 列有列表列表。如何使用 sqlite 将此列转换为关系数据库?
- android - 当我对颤振项目进行颤振清理时出现错误
- python - pd.date_range 如何排除几个小时
- python-3.x - Python 内存错误(附加 DataFrame 后)
- python - 如何在 TF 2.x 中的参差不齐的张量上运行 BatchNorm?
- laravel - Laravel 中如何按关系订购产品?
- winapi - 获取 explorer.exe 的 threadId 或通过 processName 获取 threadId
- c++ - 使用 delete[] 调试断言失败