好吧,我正在制作一个算法,在此算法之前,我必须了解solr如何在它们之间进行AND时处理结果。
So Consider a scenario
id Country City
1 India Bangalore
2 America New York
3 France Paris
4 America Los Angeles
现在假设我的查询是country = America和city = Los Angeles .. 现在,solr会像这样工作吗?
Take all Ids for country = America i.e Id (2 , 4)
Then take all Ids for City = Los Angeles i.e (4)
Then Find common in both result set i.e (4).
如果是解决AND的方法,则不具备高复杂性。 如果我们有更多的AND,那就太高了。
任何人都能说清楚我的怀疑。
编辑:显示明确描述我要求的用例。
Id(unique) returnMe desc name value
1 user1 all those living in usa country USA
2. user2 all those like game game football
3. user1 my hobbies are hobby guitar
现在如何获得以下查询的returnMe?
1. For all those users who live in usa AND hobby is guitar.
2. For all those users who live in usa OR game is football.
Answer for query first should be user1
Answer for query second should be user1 and user2
由于
答案 0 :(得分:1)
Solr可以非常快速地在数百万个文档中执行复杂的布尔运算。数据进入比特集的反向索引。我不是专家,但希望这个例子有所帮助:
Documents [1,2,3,4]
country:america : "0101" (in bitset, 0 for absent and 1 for prese)
city:los angeles : "0001"
等等
country:america and city:los angeles => "0101" AND "0001" => "0001"
一个1,000,000字节的位集可以代表1,000,000个文档(在最坏的情况下),并且您的计算机可以access it从RAM中19微秒,从磁盘起2毫秒。 CPU很自然地快速进行布尔运算(即使在100万个文档中,我们的solr服务器中的CPU也很难处理。)
所以Solr可以非常快速地在数百万个文档中进行复杂的布尔运算。
答案 1 :(得分:1)
在使用过滤器的情况下,可能会出现位集:过滤器的结果会在内存中缓存为用于快速查找的位集。
但是在一般情况下,Lucene会为每个术语创建一个迭代器;在你的例子中,将有一个美国的迭代器和洛杉矶的另一个迭代器。然后Lucene迭代这些,并且(在AND的情况下)通过查找存在于所有迭代器中的docid来组合它们。这可以通过以下方式非常有效地完成:(1)首先在具有最少匹配总数的迭代器上迭代,以及(2)跳过任何<当前匹配的docid。因为docids(通常)按顺序得分,所以可以这样做。在您的示例中,将首先评估洛杉矶术语的得分者,因为其匹配文档的数量较少;第一场比赛是“4”。然后评估美国术语的得分者,并告诉他跳到“4” - 找到匹配,然后两个迭代器终止。
总结是:不要担心:Lucene和Solr这类事情的表现非常好;这是他们被广泛接受的主要原因。