Как найти все синонимы с Elasticsearch? - PullRequest
0 голосов
/ 31 мая 2018

До сих пор я пробовал это с файлом в формате Solr:

zavesa => Gotove zavese,
zavesa, blago => Blago in dekorativno blago,
zavesa => Dodatki za zavese,
zavesa => Drogi in vodila za zavese

и

zavesa => Gotove zavese, Blago in dekorativno blago, Drogi in vodila za zavese, Dodatki za zavese

Но я всегда получаю только результаты, которые соответствуют "Drogi in vodila za zavese".Но если я удаляю «Дроги в воде за завесе»:

zavesa => Gotove zavese, Blago in dekorativno blago, Dodatki za zavese

, тогда я получаю только результаты для «Благо в декоративно благо».

Я также пытался использовать все строчные буквы:

zavesa => gotove zavese, blago in dekorativno blago, drogi in vodila za zavese, dodatki za zavese

результат один и тот же.

Я хочу получить результаты для "Готового Завеса", "Благо в декоративном благо", "Дроги в водила за завесе" и "Додатки за"zavese ", когда кто-то ищет" zavesa ".

Возможно ли это с Elasticsearch?

Моя конфигурация синонимов

var indexSettings = new IndexSettings
{
    NumberOfReplicas = 0, // If this is set to 1 or more, then the index becomes yellow, because it's running on a single node (development machine).
    NumberOfShards = 5
};

indexSettings.Analysis = new Analysis();
indexSettings.Analysis.Analyzers = new Analyzers();
indexSettings.Analysis.TokenFilters = new TokenFilters();

var listOfSynonyms = new[] {
    "zavesa => Gotove zavese, Blago in dekorativno blago, Drogi in vodila za zavese, Dodatki za zavese"
};

var customTokenFilterSynonyms = new SynonymTokenFilter
{
    Synonyms = listOfSynonyms,
    Format = SynonymFormat.Solr,
    Tokenizer = "standard"
};

indexSettings.Analysis.TokenFilters.Add("customTokenFilterSynonym", customTokenFilterSynonyms);

CustomAnalyzer customAnalyzer = new CustomAnalyzer
{
    Tokenizer = "standard",
    Filter = new List<string> { "lowercase", "asciifolding", "customTokenFilterSynonym" }
};

indexSettings.Analysis.Analyzers.Add("customAnalyzerLowercaseSynonymAsciifolding", customAnalyzer);

var indexConfig = new IndexState
{
    Settings = indexSettings
};

var request = new IndexExistsRequest(indexName);
var result = ElasticClient.IndexExists(request);

if (!result.Exists)
{
    var response = ElasticClient.CreateIndex(indexName, c => c
           .InitializeUsing(indexConfig)
            .Mappings(m => m
            .Map<ChildGroupModel>(mm => mm
                .Properties(p => p
                    .Completion(cp => cp
                       .Name(elasticsearchModel => elasticsearchModel.TitleAutSuggest)
                       .Analyzer("customAnalyzerLowercaseSynonymAsciifolding")
                       .SearchAnalyzer("customAnalyzerLowercaseSynonymAsciifolding")
                   )
                    .Completion(cp => cp
                       .Name(elasticsearchModel => elasticsearchModel.TitleSloSuggest)
                       .Analyzer("customAnalyzerLowercaseSynonymAsciifolding")
                       .SearchAnalyzer("customAnalyzerLowercaseSynonymAsciifolding")
                   )
                    .Completion(cp => cp
                       .Name(elasticsearchModel => elasticsearchModel.TitleItaSuggest)
                       .Analyzer("customAnalyzerLowercaseSynonymAsciifolding")
                       .SearchAnalyzer("customAnalyzerLowercaseSynonymAsciifolding")
                   )
                    .Text(t => t.Name(model => model.TitleAut).Analyzer("customAnalyzerLowercaseSynonymAsciifolding").SearchAnalyzer("customAnalyzerLowercaseSynonymAsciifolding"))
                    .Text(t => t.Name(model => model.TitleSlo).Analyzer("customAnalyzerLowercaseSynonymAsciifolding").SearchAnalyzer("customAnalyzerLowercaseSynonymAsciifolding"))
                    .Text(t => t.Name(model => model.TitleIta).Analyzer("customAnalyzerLowercaseSynonymAsciifolding").SearchAnalyzer("customAnalyzerLowercaseSynonymAsciifolding"))
                )
            )
        )
    );

}

Я тестируюэто в поле TitleSloSuggest.

Модель

public class ChildGroupModel
{
    [Column("id")]
    public int Id { get; set; }

    [Column("homepage_groups_id")]
    public int GroupId { get; set; }

    [Column("title_aut")]
    public string TitleAut { get; set; }

    public CompletionField TitleAutSuggest
    {
        get
        {
            return new CompletionField
            {
                Input = new[] { TitleAut }
            };
        }
    }

    [Column("title_slo")]
    public string TitleSlo { get; set; }

    public CompletionField TitleSloSuggest
    {
        get
        {
            return new CompletionField
            {
                Input = new[] { TitleSlo }
            };
        }
    }

    [Column("title_ita")]
    public string TitleIta { get; set; }

    public CompletionField TitleItaSuggest
    {
        get
        {
            return new CompletionField
            {
                Input = new[] { TitleIta }
            };
        }
    }




}

Это настройки индекса:

// 20180601112924
// http://localhost:9200/child_groups_index/_settings

{
  "child_groups_index_temp_1": {
    "settings": {
      "index": {
        "number_of_shards": "5",
        "provided_name": "child_groups_index_temp_1",
        "creation_date": "1527844777425",
        "analysis": {
          "filter": {
            "customTokenFilterSynonym": {
              "format": "solr",
              "type": "synonym",
              "synonyms": [
                "zavesa => gotove zavese, blago in dekorativno blago, drogi in vodila za zavese, dodatki za zavese"
              ],
              "tokenizer": "standard"
            }
          },
          "analyzer": {
            "customAnalyzerLowercaseSynonymAsciifolding": {
              "filter": [
                "lowercase",
                "asciifolding",
                "customTokenFilterSynonym"
              ],
              "type": "custom",
              "tokenizer": "standard"
            }
          }
        },
        "number_of_replicas": "0",
        "uuid": "WsHzMHm-QSKA4Xzxp02ipQ",
        "version": {
          "created": "6020399"
        }
      }
    }
  }
}

1 Ответ

0 голосов
/ 07 июня 2018

Я понял, что я делаю неправильно.Эта ссылка помогла: https://www.elastic.co/guide/en/elasticsearch/guide/current/multi-word-synonyms.html#_use_simple_contraction_for_phrase_queries

Вместо:

"zavesa => gotove zavese, blago in dekorativno blago, dodatki za zavese, drogi in vodila za zavese"

Мне нужно:

"gotove zavese, blago in dekorativno blago, dodatki za zavese, drogi in vodila za zavese => zavesa"

или:

"gotove zavese => zavesa",
"blago in dekorativno blago => zavesa",
"dodatki za zavese => zavesa",
"drogi in vodila za zavese => zavesa"
...