0

好吧,我正在制作一个算法,在此之前我必须了解当 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

谢谢

4

2 回答 2

1

在使用过滤器的情况下,位集可能会出现:过滤器的结果作为位集缓存在内存中以进行快速查找。

但在一般情况下,Lucene 会为每个术语创建一个迭代器。在您的示例中,将有一个针对美国的迭代器和另一个针对洛杉矶的迭代器。然后 Lucene 对这些进行迭代,并且(在 AND 的情况下)通过查找存在于所有迭代器中的 docid 来组合它们。这可以通过以下方式非常有效地完成:(1)首先迭代具有最少匹配总数的迭代器,以及(2)跳过任何 <当前匹配 docid 的 docid。因为 docid(通常)按顺序评分,所以可以这样做。在您的示例中,将首先评估 Los Angeles 术语的 scorer,因为它的匹配文档数量较少;第一个匹配是“4”。然后将评估美国学期的得分手,并告知其向前跳到“4” - 找到匹配项,

总结是:不用担心这个:这种东西的性能非常好w/Lucene和Solr;这是它们被广泛接受的主要原因。

于 2013-05-05T18:53:53.170 回答
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 个文档(在最坏的情况下),您的计算机可以在 19 微秒内从 RAM 和 2 毫秒内从磁盘访问它。CPU 天生擅长快速执行布尔运算(我们的 solr 服务器中的 CPU 即使处理数以亿计的文档也几乎不忙)。

因此 Solr 可以非常快速地对数百万个文档进行复杂的布尔运算。

于 2013-05-05T13:51:07.100 回答