我需要根据与特定查询的相关性对数据集中的记录进行排名,但不能过滤掉不相关的数据。如果可能,我想使用Algolia。
想象一下,我有一个水果箱及其地理位置的数据集。
[
{
"fruits": ["apple", "orange"],
"_geoloc": {"lat": 1, "lng": 2}
},
{
"fruits": ["banana", "apple"],
"_geoloc": {"lat": 8, "lng": 2}
},
{
"fruits": ["banana"],
"_geoloc": {"lat": 5, "lng": 2}
},
{
"fruits": ["apple", "banana"],
"_geoloc": {"lat": 8, "lng": 2}
},
{
"fruits": ["orange"],
"_geoloc": {"lat": 1, "lng": 2}
}
]
我需要查询数据,以便返回所有数据,但按匹配排序到输入查询以及与指定地理位置的接近程度。
因此,如果地理位置为{"lat": 1, "lng": 2}
且查询为apple, banana
,则生成的排名数据将如下所示:
[
{
"fruits": ["apple", "banana"],
"_geoloc": {"lat": 8, "lng": 2}
},
{
"fruits": ["banana", "apple"],
"_geoloc": {"lat": 8, "lng": 2}
},
{
"fruits": ["apple", "orange"],
"_geoloc": {"lat": 1, "lng": 2}
},
{
"fruits": ["banana"],
"_geoloc": {"lat": 5, "lng": 2}
},
{
"fruits": ["orange"],
"_geoloc": {"lat": 1, "lng": 2}
}
]
首先匹配查询的记录首先出现,然后记录具有不同的单词排序,然后记录一些单词(但更接近),最后记录没有匹配的单词。
到目前为止,我已经使用Algolia中的Dashboard来解决这个问题。但是,当这里的需求是始终显示所有数据(刚排序)时,总会过滤掉不相关的记录。
通过上面描述的查询策略,它将返回如下内容:
[
{
"fruits": ["apple", "banana"],
"_geoloc": {"lat": 8, "lng": 2}
},
{
"fruits": ["banana", "apple"],
"_geoloc": {"lat": 8, "lng": 2}
}
]
返回与查询匹配的数据,但不返回其余数据。即使丢失关键字的数据也会被删除。
我考虑使用disjunctive faceting来实现这一目标,但这有两个问题:
我需要在单词查询中使用拼写错误进行全文搜索。例如,用户可以添加“苹果”或“熟苹果”的方面,并且包含“苹果”的记录仍然是高度排名的。相反,对“fruits”数组中的内容没有限制。该数组也可能包含拼写错误或相关但不完全匹配。
仍然不会返回与查询不匹配的记录。通过刻面,仅在水果阵列中的“橙色”和“香蕉”记录仍然不会被返回。
答案 0 :(得分:6)
有两种方法可以使用Algolia执行此操作:作为搜索引擎或作为主数据源。作为第一个选择是Algolia建议的,我将从这个开始。
Algolia是一个搜索引擎,它旨在处理搜索查询并返回与查询相关的所有记录的子集。
这意味着Algolia不能用作主要数据源:大多数情况下,引擎不会返回所有对象,而是当前查询最相关的对象。搜索引擎和常规数据库之间的这种差异允许所有使Algolia如此快速的优化。
对于根据内容和位置对所有包装箱进行分类的用例,您可以使用Algolia 知道哪些与查询相关,然后对整个数据集进行排序使用该信息。
例如,您可以从主数据库中获取包装箱列表和在Algolia中执行查询以检查哪些包装箱最相关。
然后,您将首先显示Algolia结果,然后显示列表中的剩余包(可能表示These crates don't contain the fruits you requested (apple banana)
)。
您可以设置索引设置:
geo
条件用于对fruits
与查询匹配的包装箱进行排名)然后,Algolia将返回包含查询中每个水果的所有包装箱,按地理位置接近排序。
您还可以使用removeWordsIfNoResults=allOptional
,因此,如果用户输入orange kiwi
并且没有包含两者的箱子,您将获得仅包含orange
或仅包含kiwi
的包。同样,如果用户键入kiwi
并且没有包含它的条件箱,则引擎将返回所有仅按地理位置排序的包装箱。
如果您的数据仅存储在Algolia中,您可以进行两次查询:第一次查询所有记录,第二次查询相关结果。然后,您可以先将相关的值合并,然后显示结果列表。
您可以使用search
获取相关结果,使用browse
获取1000个批次的所有记录。一旦有了这两个列表,您只需要显示相关的包装箱,从第二个列表中删除重复项,然后显示剩余的包装箱。
索引设置与先前相同,先按内容过滤,然后按地理位置排序
与第一种方法一样,您也可以使用removeWordsIfNoResults
从查询中删除单词,直到引擎找到相关结果。