ElasticSearch с проблемой запроса NEST

Простите мою новизну, так как я новичок как в ElasticSearch, так и в NEST. Я работаю над прототипом для оценки ElasticSearch в реализуемом решении .NET. Прототип компилируется и, кажется, выполняет поиск, но не возвращает результаты должным образом. Он возвращает результаты только по нескольким ключевым словам, только в нижнем регистре, игнорируя другие и ничего не возвращая. Я думаю, что в моем запросе что-то не так. Вот часть запроса (предполагается, что информация о соединении и индекс по умолчанию указаны и построены).

// string searchString to be searched against ProductName and Description fields.            
var searchResults = client.Search<Product>(s=>s
            .From(0)
            .Size(100)
            .Query(q=>q.Term(p=>p.ProductName, searchString) || 
                q.Term(p=>p.Description, searchString)
            ));

Вот модель, если нужно:

[ElasticType(IdProperty = "ProductID")]
public class Product
{
    [ScaffoldColumn(false)]
    [JsonIgnore]
    public int ProductID { get; set; }

    [Required, StringLength(100), Display(Name = "Name")]
    public string ProductName { get; set; }

    [Required, StringLength(10000), Display(Name = "Product Description"), DataType(DataType.MultilineText)]
    public string Description { get; set; }

    public string ImagePath { get; set; }

    [Display(Name = "Price")]
    public double? UnitPrice { get; set; }

    public int? CategoryID { get; set; }
    [JsonIgnore]
    public virtual Category Category { get; set; }
}

Цените помощь!


person Michael    schedule 27.08.2014    source источник
comment
Вы действительно хотите, чтобы название и описание продукта соответствовали строке поиска?   -  person Josh C.    schedule 28.08.2014
comment
Я хочу, чтобы он тоже совпадал, и да, я также использовал оператор OR с небольшими изменениями.   -  person Michael    schedule 28.08.2014
comment
ОБНОВЛЕНИЕ: Хорошо, видимо, я раньше ошибся с оператором ИЛИ. Теперь поиск работает лучше, за исключением того, что он, кажется, портит регистр букв .... например. Custom ничего не возвращает, но custom возвращает Kat Custom Car...   -  person Michael    schedule 28.08.2014
comment
Можете ли вы опубликовать свой новый код?   -  person Josh C.    schedule 28.08.2014


Ответы (1)


Ваша проблема в том, что вы используете условные запросы, которые не анализируются и поэтому чувствительны к регистру.

Попробуйте использовать сопоставить запрос (который анализируется) вместо этого:

var searchResults = client.Search<Product>(s => s
    .From(0)
    .Size(100)
    .Query(q => 
        q.Match(m => m.OnField(p => p.ProductName).Query(searchString)) || 
        q.Match(m => m.OnField(p => p.Description).Query(searchString))
     )
);

Сделав еще один шаг вперед, поскольку вы запрашиваете один и тот же текст в двух разных полях, вы можете использовать запрос на несколько совпадений вместо объединения двух терминов:

var searchResults = client.Search<Product>(s => s
    .From(0)
    .Size(100)
    .Query(q => q
        .MultiMatch(m => m
            .OnFields(p => p.Product, p => p.Description)
            .Query(searchText)
        )
     )
);

Для лучшего понимания анализа отображение и анализ раздел из Полного руководства, который стоит прочитать .

person Greg Marzouka    schedule 28.08.2014
comment
У тебя неплохо получилось! Это решило мою проблему. Вы случайно не знаете, как сделать запрос, похожий на contains? (например, Кэт Кэт...) - person Michael; 28.08.2014