2011-10-05 25 views
2

在我的項目中,我們使用solr爲很多不同類型的文檔編制索引,例如Books和Persons,其中包含一些常用字段(如名稱)和一些特定類型的字段(如類別或組人屬於至)。任何方式來合併solr中的兩個查詢?

我們想要做查詢,可以找到書籍和人員,爲每個文件類型應用一些過濾器。喜歡的東西:

  • 找到名字和/或內容
  • 但只有書籍從類別「小說」和「幻想」
  • 只有從一羣人「的所有書籍,並以「讓」人穿山甲」
  • 一切按分數

一個非常簡單的方式做整理,這將是:

q = name:jean content:jean 
& 
fq= 
    (type:book AND category:(fiction fantasy)) 
    OR 
    (type:person AND group:pangolin) 

但很可惜,因爲fq被緩存起來,我喜歡的東西讓我簡單等更具重用性fq這樣的:

  • fq=type:book
  • fq=type:person
  • fq=category(fiction fantasy)
  • fq=group:pangolin

有沒有辦法告訴solr合併或組合許多查詢?像「分組」fq在一起。

我對_query_讀了一些關於嵌套查詢的內容,但關於它的極少數文檔讓我覺得這不是我正在尋找的解決方案。

+0

我敢肯定,這是不可能的。每個過濾器查詢(fq)都是獨立計算的,並生成一個緩存docset(無序的docid集合)。 Fq是有用的(快速讀取),因爲當指定其中的一些文檔時,文檔集會被快速截斷搜索空間。換句話說:指定多個過濾器查詢在邏輯上導致AND'ing他們 –

+0

這是一個恥辱,Solr Fieldcollapsing http://wiki.apache.org/solr/FieldCollapsing不支持追加fq的後你指定字段組合(在你的情況'類型'),這將幾乎解決它。不過我希望這個鏈接可能會有用,因爲這是一種很好的方式來表示每種類型的N個頂級文檔。雖然我意識到這不是100%你在這裏問.. –

+0

我非常確定這也是不可能的,但我希望我錯過了一些:)在一個查詢中設置fq組是非常酷的事情,類似於'fq = {group:A} ...&fq = {group:A} ...&fq = {group:B}',所以solr會播放查詢,然後用類似「all fq A組的所有fq「而不是其簡單的」全部fq「。那麼,我想我必須使用我在@Paige Cook回答中評論中描述的非現場條件解決方案。無論如何感謝您的答案! –

回答

3

由於吉爾特 - 揚在他的回答中提到它,這樣做的可能性fq之間OR是Solr的詢問功能,但具有非常小支持現在:https://issues.apache.org/jira/browse/SOLR-1223

所以我設法模仿我想要的東西在一個簡單的方法:

  • 每個字段的文件類型可以有,我們要定義每次一個值(所以如果在我的自己的示例書籍可以沒有類別,在索引時,我們仍然必須定義類似於category=noCategoryCode
  • 在多個類型的查詢中對這些字段之一使用過濾器時,我們在過濾器中添加了一個不存在的條件,所以fq=category:fiction成爲fq=category:fiction (*:* AND -category:*)

通過這種方式,所有其他類型(如人)將通過這個過濾器,過濾器代表相當原子和常用的 - 所以緩存仍然是有用的。

所以,我完整的例子就變成:

q = name:jean content:jean 
& 
fq= type:(book person) 
& 
fq= category:(fiction fantasy) (*:* AND -category:*) 
& 
fq= group:(pangolin) (*:* AND -group:*) 

儘管如此,等不及要修補SOLR-1223 :)

0

您可以在同一時間

q=name:jean content:jean&fq=type:book&fq=type:person&fq=category(fiction fantasy)&fq=group:pangolin

+1

因爲'書'和'人'是不相交的 - > fq =鍵入:book&fq = type:person會返回0個結果。 –

+0

我必須同意@ Geert-Jan:我的整個問題是'fq = category:(幻想小說)'將會刪除所有可能的人,'fq = group:pangolin'將會扔掉所有的書。一種可能的方法是添加一個非現場條件,例如'fq = group:pangolin(-group:[* TO *])':它會將所有人穿在「穿山甲」組中,並且將所有文檔沒有田野小組(所以書)。我只是希望有一個更好的方式來做到這一點。 –

0

也許我不理解您的問題應用多個過濾器的查詢,但查詢和過濾器之間的唯一區別是,過濾器緩存。如果你不關心緩存,只需修改其查詢:

real query +((type:book category:fiction) (type:person group:pangolin))

+0

謝謝,但問題的根本在於嘗試一些關心緩存和性能的事情。 –

+0

@XavierPortebois:你試過了嗎?通常情況下,查詢不會比過濾器慢很多。 – Xodarap

+0

事實上,我目前沒有數據做這樣的壓力測試,但我會盡快做到:) –