Solrnet: проблема, когда значением поля поиска является оператор запроса (например, или, и) - PullRequest
3 голосов
/ 18 мая 2011

Если быть более точным, я буду работать с примером ...

Чистый запрос: (введите: 77 AND (zipCode: 12345 ИЛИ имя: ИЛИ))

При запросе на странице администрирования Solr выдается исключение:

org.apache.lucene.queryParser.ParseException: невозможно проанализировать ...

Итак, на странице администрирования Solr я изменил запрос на:

(тип: "77" И (zipCode: "12345" ИЛИ имя: "ИЛИ"))

который работал как брелок

Теперь у меня проблема сделать то же самое с solrnet. Я использую класс SolrQueryByField для запросов. Когда я работаю с

новый SolrQueryByField («имя», «ИЛИ»)

Я получаю Solrnet.Exceptions.InvalidFieldException, которая соответствует странице администрирования Solr, но когда я работаю с

новый SolrQueryByField ("имя", "\" ИЛИ "")

Я получаю неправильные результаты. Изучив сетевой трафик, я обнаружил, что запрос http get отличается (для краткости даются только имя и имя поля):

имя% 3A% 22OR% 22 => со страницы администрирования Solr

имя% 3a% 5c% 22OR% 5c% 22 => из solrnet

У меня вопрос: что мне делать, чтобы solrnet не добавил% 5C (обратную косую черту) в строку запроса?

Заранее спасибо

Ответы [ 2 ]

8 голосов
/ 18 мая 2011

SolrQueryByField производит кавычки / экранированные значения.Если у вас есть особый случай, когда это нежелательно (например, этот случай), вы можете использовать SolrQuery, например:

Query.Field("type").Is(77) && (Query.Field("zipCode").Is("12345") || Query.Simple("name:\"OR\""))
1 голос
/ 11 октября 2017

Пожалуйста, попробуйте передать массив строк, который содержит несколько имен полей и текст для поиска в методе ниже.Он возвратит запрос solrnet для поиска с несколькими именами полей с условием ИЛИ.

public ISolrQuery BuildQuery(string[] SearchFields, string SearchText)
    {
        try
        {
            AbstractSolrQuery firstQuery = new SolrQueryByField(SearchFields[0], SearchText) { Quoted = false };

            for (var i = 1; i < parameters.SearchFields.Length; i++)
            {
                firstQuery = firstQuery || new SolrQueryByField(SearchFields[i], SearchText) { Quoted = false };
            }

            return firstQuery;
        }
...