Поиск повторяющихся значений в Solr

Есть ли способ построить запрос таким образом, чтобы он идентифицировал / возвратил документы, в которых дублируется конкретное поле. То, что я ищу, является эквивалентом этого в SQL:

SELECT content, count(*) FROM documents GROUP BY content ORDER BY count(*) DESC

В основном, дайте мне документы, содержание которых одинаково. Все, что я нашел, обсуждает, как выбрасывать дубликаты при вставке или как избавляться от них в результатах поиска. Я пытался использовать FieldCollapsing, но я получаю следующую ошибку:

"error": {
  "msg": "can not use FieldCache on a field which is neither indexed nor has doc values: content",
  "code": 400
}

На основании ошибки я предположил, что это не удалось, потому что content не индексируется Я попытался просто поиграть с группировкой, используя другое индексированное поле, а не многозначное, в котором хранится URL-адрес документов, но я не могу сделать ни одного из полученных групп, особенно groupValue, Я могу попытаться создать поле копирования, которое проиндексировано, но я не уверен, что это даст мне то, что я ищу, и моему сканеру для сканирования потребуется более 24 часов.

3 ответа

Решение

Это очень легко сделать в Solr.

Прежде всего, убедитесь, что ваш schema.xml находится в квадрате, поле, над которым вы будете выполнять эту операцию, должно быть сохранено и проиндексировано. Тип поля должен быть строковым (это сохранит данные как есть, без токенизации).

Затем, проиндексируйте ваш контент и выполните запрос для него, предполагая, что имя поля - field1.

q =:& facet = true & facet.field = field1 & facet.mincount = 1

Вы получите ответ обо всех значениях для field1 и количестве одинаковых значений.

Использование граней даст требуемые результаты. Сначала вам нужно проиндексировать содержимое вашего поля в solr с соответствующим определением. например:

<field indexed="true" multiValued="false" name="content" stored="true" type="string_ci"/> где тип в основном отображается следующим образом

<fieldType class="solr.TextField" name="string_ci" positionIncrementGap="100"> <analyzer> <tokenizer class="solr.KeywordTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.TrimFilterFactory"/> </analyzer> </fieldType>

и для запроса фасета попробуйте следующее q=:&facet=true&facet.field=content&facet.mincount=-1&facet.sort=count

[ https://wiki.apache.org/solr/SimpleFacetParameters][facet document]

https://wiki.apache.org/solr/SimpleFacetParameters

Если вы пытаетесь получить дубликаты в почти уникальных полях с большим количеством элементов, фасеты можно использовать с запросом терминов

{! Terms f=partid}partid1,partid2..N&facet=true&facet.field=partid&facet.limit=N&facet.mincount=2

Другие вопросы по тегам