我目前正在为一个使用PHP API查询Elasticsearch 5.6索引的网站开发搜索引擎。我在特定查询上被困了很长时间,这就是为什么我正在寻求社区的帮助。让我提供更多细节:
- ES 索引包含人的文档,并且这些人具有出生名和姓氏(如果该人是未婚的男性或女性,则这两个值相同)。还有一些信息,例如名字、日期和其他与我的问题无关的信息。
- 网站搜索引擎只有一个字段用于出生姓名和姓氏。
我被要求创建一个查询,所以每当用户在该字段中输入一个值时,我必须得到以下结果:
- 如果该值与一个人的出生名或姓氏 100% 匹配,我应该让他们获得完全相同的分数值
- 如果该值与 100% 不匹配,那么我将得到至少 5 个字符的结果,这些字符的出生名或姓氏相似
- 必须以非常具体的方式对结果进行排序。首先,匹配 100% 的结果按日期、出生姓名和姓氏的字母顺序排序,然后部分匹配的结果按分数、日期和字母顺序排序。
我查询的字段分别命名为nom.unsplit、nom.ngram、nomNaissance.unsplit、nomNaissance.ngram
我一直在尝试这个查询,它为搜索出生名提供了完美的结果,但没有找到姓氏(显然)。如果我将另外两个字段添加到查询中,结果仍然不令人满意,因为如果姓氏匹配,弹性搜索会给出更好的相关性分数,而不是出生名匹配。
我还尝试了带有过滤器和提升的 constant_score 查询。它有效,但前提是我正在寻找 100% 的结果。我尝试将布尔查询和常量分数查询结合起来,但我无法让它工作。我想补充一点,搜索引擎包含更多字段,因此我需要能够将此特定查询插入到更大的 bool 查询中,该查询收集了我已经在使用的所有子查询。我会接受任何建议,如果需要,我会提供补充信息。