ElasticSearch-Nest v7.x «Игнорировать = true» не работает на полях - PullRequest
1 голос
/ 29 сентября 2019

Я пытаюсь выполнить индексацию определенных полей из класса POCO и декорирую некоторые свойства как "Ignore = true", и эти поля не должны индексироваться, но должны храниться. Я хочу, чтобы эти поля появлялись в результатах поиска, но не должны быть индексированными.

Я пытаюсь сопоставить несколько полей, которые должны быть проиндексированы, и игнорирую все остальные поля, для которых "Ignore = true" имеетдекоратор, предоставленный библиотекой Nest.

Вот пример класса POCO.

[PropertyName("doi")]
public string Doi { get; set; }

[PropertyName("displayName")]
public string DisplayName { get; set; }

[PropertyName("itemType")]
public string ItemType { get; set; }

[PropertyName("fileReference")]
public string FileReference { get; set; }

[PropertyName("textFirstPage", Ignore = true)]
public string TextFirstPage { get; set; }

[PropertyName("textLastPage", Ignore = true)]
public string TextLastPage { get; set; }

[PropertyName("citationTitle", Ignore = true)]
public string CitationTitle { get; set; }

[PropertyName("translatedPublicationTitle", Ignore = true)]
public string TranslatedPublicationTitle { get; set; }

[PropertyName("alternatePublicationTitle", Ignore = true)]
public string AlternatePublicationTitle { get; set; }

[PropertyName("publicationSubTitle", Ignore = true)]
public string PublicationSubTitle { get; set; }

Но все поля, которые были упомянуты в классе POCO, появляются в Mappingкогда я пытаюсь увидеть отображение индекса.

{
    "cweeindex" : {
        "mapping": {
            "properties" : {
                "doi": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "displayName": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "fileReference": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "itemType": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                 "citationTitle": {
                    "type": "boolean"
                },
                "publicationSubTitle": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "textFirstPage": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "textLastPage": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "translatedPublicationSubTitle": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
                "translatedPublicationTitle": {
                    "type": "text",
                    "fields": {
                        "keyword": {
                            "type": "keyword",
                            "ignore_above": 256
                        }
                    }
                },
            }   
        }
    }
}

ОБНОВЛЕНИЕ !! Код Nest для Mapping ниже

var createIndexResponse = _connectionToEs.EsClient().Indices.Create("cweeindex", c => c
                                                    .Map<EsStandardContract>(m => m.AutoMap())
                                                );

Пожалуйста, дайте мне знать, что я делаю не так !! Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 30 сентября 2019

Это похоже на регрессию, которая произошла с изменениями сериализации с 6.x до 7.x. Я открыл проблему по адресу.

На данный момент вы можете использовать Nest.IgnoreAttribute. Например

[PropertyName("doi")]
public string Doi { get; set; }

[PropertyName("displayName")]
public string DisplayName { get; set; }

[PropertyName("itemType")]
public string ItemType { get; set; }

[PropertyName("fileReference")]
public string FileReference { get; set; }

[Ignore]
public string TextFirstPage { get; set; }

[Ignore]
public string TextLastPage { get; set; }

[Ignore]
public string CitationTitle { get; set; }

[Ignore]
public string TranslatedPublicationTitle { get; set; }

[Ignore]
public string AlternatePublicationTitle { get; set; }

[Ignore]
public string PublicationSubTitle { get; set; }
0 голосов
/ 30 сентября 2019

Спасибо за вашу помощь.

Поскольку [Ignore] декоратор не разрешал добавлять поля в Mapping, он также игнорировал свойства при индексации. Я хотел иметь сопоставление с определенными полями, но документ, созданный при индексировании, должен содержать некоторые другие поля, которые имели значение, которое должно было использоваться при получении результатов (более похожих на поля проекции) в выходных данных. Я не хотел, чтобы эти поля были включены динамически, поэтому я создал объект класса отображения, который имел все свойства, которые должны быть включены в отображение индекса, и ему было присвоено значение dynamic=false.

. использование другого объекта класса, который имел все свойства, которые были включены в отображение, а также некоторые другие свойства. Эти другие свойства будут использоваться при получении результатов / вывода, но я не хотел, чтобы они были доступны для поиска или фильтрации (имеется в виду, не хотел индексировать).

Вот класс отображения

 public class EsMappingContract
{
    [PropertyName("doi")]
    public string Doi { get; set; }

    [PropertyName("displayName")]
    public string DisplayName { get; set; }

    [PropertyName("itemType")]
    public string ItemType { get; set; }

    [PropertyName("fileReference")]
    public string FileReference { get; set; }
}

Вот класс индексации

public class EsIndexingContract
{
    [PropertyName("doi")]
    public string Doi { get; set; }

    [PropertyName("displayName")]
    public string DisplayName { get; set; }

    [PropertyName("itemType")]
    public string ItemType { get; set; }

    [PropertyName("fileReference")]
    public string FileReference { get; set; }

    [PropertyName("citationTitle", Ignore = true)]
    public string CitationTitle { get; set; }

    [PropertyName("translatedPublicationTitle", Ignore = true)]
    public string TranslatedPublicationTitle { get; set; }

    [PropertyName("alternatePublicationTitle", Ignore = true)]
    public string AlternatePublicationTitle { get; set; }

    [PropertyName("publicationSubTitle", Ignore = true)]
    public string PublicationSubTitle { get; set; }
}

Я не знал, что [Ignore] будет игнорировать свойства при индексации, и поэтому мне пришлось пойти на этот подход. Мне бы понравился какой-нибудь другой декоратор, который указал бы, что ES игнорирует при создании Mapping, но не следует игнорировать его при индексации, если свойства имеют значение.

Еще раз спасибо за помощь !! Надеюсь, это поможет кому-то в будущем.

...