2015-02-12 4 views
0

У меня есть документы Solr, которые могут иметь 3 возможных состояния (state_s в {new, updated, lost}). Эти документы имеют поле с именем ip_s. Эти документы также имеют поле nlink_i, которое может быть равно 0.Solr facet на подмножестве документов

Что я хочу знать: сколько новых ip_s у меня есть. Когда я рассматриваю новый ip, это ip, который принадлежит документу, который state_s="new", который не отображается ни в одном документе с state_s = "updated" ИЛИ state_s = "lost".

Использование Solr поиска фаски Я нашел решение, используя следующие параметры запроса:

  • Q = sate_s: "потерянное" + OR + sate_s: "обновленная"
  • фаски = верно & facet.field = ip_s & facet.limit = -1

в принципе, все ф в

"facet_fields":{ 
     "ip_s":[ 
     "105.25.12.114",1, 
     "105.25.15.114",1, 
     "114.28.65.76",0, 
     ...] 

с наличием 0 (например, 114.28.65.76) являются «новыми ips».

Q1: Есть ли лучший способ для этого поиска. Поскольку использование описанного выше вопроса фасета мне еще нужно прочитать список ip_s и подсчитать весь ip с вступлением = 0.

Q2: Если я хочу сделать тот же поиск (т.е. получить новый ip), но я хочу рассматривать только документы, где nlink_i> 0, как я могу это сделать ?. Если я добавлю фильтр: fq=nlink_i:[1 TO *], все ip, появляющиеся в документах с link_i = 0, также будут иметь их число вхождения равным 0. Поэтому я не могу применить описанное выше решение, чтобы получить новый ip.

ответ

0

Я нашел другое решение с использованием facet.pivot, который работает на Q1 и Q2:

http://localhost:8983/solr/collection1/query?q=nbLink_i:[1%20TO%20*]&updated&facet=true&facet.pivot=ip_s,state_s&facet.limit=-1&rows=0 
1

Q1: Чтобы избежать граней 0, вы можете использовать facet.mincount = 1.

Q2: Я думаю, что решение выше должно также ответить на Q2?

+0

мне нужна 0 из них, мне нужно только их в основном, если я мог бы установить facet.maxcount = 0 Я бы, но это делает не существует. – lizzie

+0

Я вижу - есть билет Solr о создании параметра facet.maxcount; Я не понимаю, как вы могли бы получить то, что хотите, без него через грань. Вы также можете посмотреть внутренние запросы; эта ссылка имеет отношение к вашему вопросу: http://stackoverflow.com/questions/24651759/solr-join-not-in-subselect – Yann

1

В качестве альтернативы фасеткам вы можете использовать Solr grouping functionality. Агрегация значений для вашего Q1 не становится намного приятнее, но, по крайней мере, Q2 работает. Это будет выглядеть примерно так:

select?q=*:*&group=true&group.field=ip_s&group.sort=state_s asc&group.limit=1 

Для того, чтобы ваша программной логика агрегации на работу, вы должны изменить значение state_s для новых записей в то, что появляется первым для возрастания упорядоченности. Затем вы считаете все группы, содержащие документ с «новым государственным документом» в качестве первой записи. Та же логика все еще работает, если вы добавите параметр fq для адреса Q2.

+0

Это было отличное предложение спасибо. Мне не удалось получить количество граней внутри групп. Однако группировка хороша, особенно если вам нужно получить идентификатор документов! – lizzie

+0

Вам не нужно использовать счет фасета - вместо этого вы считаете группы. –

Смежные вопросы