Использование / синтаксис ElasticSearch Synonym в моем индексе - PullRequest
1 голос
/ 06 апреля 2020

Я новичок в ElasticSearch. Я пробую простой генеалогический проект в ES и хочу использовать синонимы для имени и фамилии. У меня есть следующие настройки индекса ElasticSearch, и я буду sh, чтобы добавить два анализатора синонимов в мои настройки, а затем использовать эти два для обработки синонимов времени поиска в различных полях. Я не знаю, как добавить правильные записи в мой файл «setup» JSON

Мои два файла синонимов называются Given_synonyms.txt и surname_synonyms.txt . Я был бы очень признателен за помощь в получении правильного синтаксиса для этого json файла.

Я добавил (заглавными буквами) очень обобщенный c псевдокод для того, что я хочу сделать, в надежде, что он имеет больше смысла для читателей таким образом.

    {
      "settings": {
        "index": {
          "number_of_shards": "128",
          "number_of_replicas": "0",
          "analysis": {
            "filter": {
              "dbl_metaphone": {
                "type":    "phonetic",
                "encoder": "double_metaphone",
                "max_code_len" : 5
              }
            },
            "analyzer": {
              "dbl_metaphone": {
                "tokenizer": "standard",
                "filter":    "dbl_metaphone"
              }
            }
    I ASSUME THE SYNONYM ENTRIES GO HERE FOR THE TWO SYNONYM FILES - BUT I DON'T KNOW HOW THAT SHOULD BE DONE
          }
        }
      },
      "mappings": {
        "test": {
          "_all": {
            "enabled": false
          },
          "_source": {
            "enabled": true
          },
          "properties": {
            "GivenNames": {
              "type": "keyword",
              "index_options": "freqs",
              "store": "false",
              "similarity": "boolean",
              "norms": "false",
              "fields": {
                "phonetic": {
                  "type": "text",
                  "analyzer": "dbl_metaphone"
                }
                I WANT TO USE THE GIVEN_SYNONYMS SEARCH ANALYZER HERE IN ADDITION TO THE DBL_METAPHONE
              }
            },
            "Surnames": {
              "type": "keyword",
              "index_options": "freqs",
              "store": "false",
              "similarity": "boolean",
              "norms": "false",
              "fields": {
                "phonetic": {
                  "type": "text",
                  "analyzer": "dbl_metaphone"
                }
                I WANT TO USE THE SURNAME_SYNONYMS SEARCH ANALYZER HERE IN ADDITION TO THE DBL_METAPHONE
              }
            },
            "FatherGivenNames": {
              "type": "keyword",
              "index_options": "freqs",
              "store": "false",
              "similarity": "boolean",
              "norms": "false",
              "fields": {
                "phonetic": {
                  "type": "text",
                  "analyzer": "dbl_metaphone"
                }
              }
              I WANT TO USE THE GIVEN_SYNONYMS SEARCH ANALYZER HERE IN ADDITION TO THE DBL_METAPHONE
            },
            "FatherSurnames": {
              "type": "keyword",
              "index_options": "freqs",
              "store": "false",
              "similarity": "boolean",
              "norms": "false",
              "fields": {
                "phonetic": {
                  "type": "text",
                  "analyzer": "dbl_metaphone"
                }
              }
              I WANT TO USE THE SURNAME_SYNONYMS SEARCH ANALYZER HERE IN ADDITION TO THE DBL_METAPHONE
            },
            "MotherGivenNames": {
              "type": "keyword",
              "index_options": "freqs",
              "store": "false",
              "similarity": "boolean",
              "norms": "false",
              "fields": {
                "phonetic": {
                  "type": "text",
                  "analyzer": "dbl_metaphone"
                }
              }
              I WANT TO USE THE GIVEN_SYNONYMS SEARCH ANALYZER HERE IN ADDITION TO THE DBL_METAPHONE
            },
            "MotherSurnames": {
              "type": "keyword",
              "index_options": "freqs",
              "store": "false",
              "similarity": "boolean",
              "norms": "false",
              "fields": {
                "phonetic": {
                  "type": "text",
                  "analyzer": "dbl_metaphone"
                }
              }
              I WANT TO USE THE SURNAME_SYNONYMS SEARCH ANALYZER HERE IN ADDITION TO THE DBL_METAPHONE
            },
            "SpouseGivenNames": {
              "type": "keyword",
              "index_options": "freqs",
              "store": "false",
              "similarity": "boolean",
              "norms": "false",
              "fields": {
                "phonetic": {
                  "type": "text",
                  "analyzer": "dbl_metaphone"
                }
              }
              I WANT TO USE THE GIVEN_SYNONYMS SEARCH ANALYZER HERE IN ADDITION TO THE DBL_METAPHONE
            },
            "SpouseSurnames": {
              "type": "keyword",
              "index_options": "freqs",
              "store": "false",
              "similarity": "boolean",
              "norms": "false",
              "fields": {
                "phonetic": {
                  "type": "text",
                  "analyzer": "dbl_metaphone"
                }
              }
              I WANT TO USE THE SURNAME_SYNONYMS SEARCH ANALYZER HERE IN ADDITION TO THE DBL_METAPHONE
            },
            "ChildrenGivenNames": {
              "type": "keyword",
              "index_options": "freqs",
              "store": "false",
              "similarity": "boolean",
              "norms": "false",
              "fields": {
                "phonetic": {
                  "type": "text",
                  "analyzer": "dbl_metaphone"
                }
              }
              I WANT TO USE THE GIVEN_SYNONYMS SEARCH ANALYZER HERE IN ADDITION TO THE DBL_METAPHONE
            },
            "BirthYears": {
              "type": "short"
            },
            "BirthLocations": {
              "type": "integer"
            },
            "DeathYears": {
              "type": "short"
            },
            "DeathLocations": {
              "type": "integer"
            },
            "MarriageLocations": {
              "type": "integer"
            },
            "MarriageYears": {
              "type": "integer"
            },
            "ResidenceLocations": {
              "type": "integer"
            }
          }
        }
      }
    }

1 Ответ

1 голос
/ 07 апреля 2020

Во-первых, давайте посмотрим анализатор синонимов и как вы включаете файл. Отсюда https://www.elastic.co/guide/en/elasticsearch/reference/current/analysis-synonym-tokenfilter.html вы можете увидеть, как это можно настроить. Вы упоминаете два файла. Вам лучше определить один файл, который включает или ваши синонимы.

{
  "settings": {
    "index": {
      "number_of_shards": "128",
      "number_of_replicas": "0",
      "analysis": {
        "filter": {
          "dbl_metaphone": {
            "type": "phonetic",
            "encoder": "double_metaphone",
            "max_code_len": 5
          },
          "given_synonyms": {
            "type": "synonym",
            "synonyms_path": "analysis/given_synonyms.txt"
          },
          "surname_synonyms": {
            "type": "synonym",
            "synonyms_path": "analysis/surname_synonyms.txt"
          }
        },
        "analyzer": {
          "dbl_metaphone": {
            "tokenizer": "standard",
            "filter": "dbl_metaphone"
          },
          "given_synonyms": {
            "tokenizer": "whitespace",
            "filter": "given_synonyms"
          },
          "surname_synonyms": {
            "tokenizer": "whitespace",
            "filter": "surname_synonyms"
          }
        }
      }
    }
  }
}

Имейте в виду, что при использовании файла (или нескольких файлов) для синонимов необходимо убедиться, что каждый узелasticsearch имеет доступ к этому файлу. Другой способ сделать это - указать свои синонимы в разделе настроек. Это может быть лучше, если число синонимов не очень велико или есть проблемы с тем, чтобы сделать файлы доступными для узлов эластичного поиска. Вы можете проверить другие способы определения синонимов в документации

{
  "settings": {
    "index": {
      "number_of_shards": "128",
      "number_of_replicas": "0",
      "analysis": {
        "filter": {
          "dbl_metaphone": {
            "type": "phonetic",
            "encoder": "double_metaphone",
            "max_code_len": 5
          },
          "given_synonyms": {
            "type": "synonym",
            "synonyms": [ ... YOUR SYNONYMS HERE ...]
          },
          "surname_synonyms": {
            "type": "synonym",
            "synonyms": [ ... YOUR SYNONYMS HERE ...]
          }
        },
        "analyzer": {
          "dbl_metaphone": {
            "tokenizer": "standard",
            "filter": "dbl_metaphone"
          },
          "given_synonyms": {
            "tokenizer": "standard",
            "filter": "given_synonyms"
          },
          "surname_synonyms": {
            "tokenizer": "standard",
            "filter": "surname_synonyms"
          }
        }
      }
    }
  }
}

. Для достижения окончательного решения вы можете иметь что-то вроде этого

{
  "settings": {
    "index": {
      "number_of_shards": "128",
      "number_of_replicas": "0",
      "analysis": {
        "filter": {
          "dbl_metaphone": {
            "type": "phonetic",
            "encoder": "double_metaphone",
            "max_code_len": 5
          },
          "given_synonyms": {
            "type": "synonym",
            "synonyms_path": "analysis/given_synonyms.txt"
          },
          "surname_synonyms": {
            "type": "synonym",
            "synonyms_path": "analysis/surname_synonyms.txt"
          }
        },
        "analyzer": {
          "dbl_metaphone": {
            "tokenizer": "standard",
            "filter": "dbl_metaphone"
          },
          "dbl_metaphone_given_synonym": {
            "tokenizer": "standard",
            "filter": [
              "given_synonyms",
              "dbl_metaphone"
            ]
          },
          "dbl_metaphone_surname_synonym": {
            "tokenizer": "standard",
            "filter": [
              "surname_synonyms",
              "dbl_metaphone"
            ]
          }
        }
      }
    }
  }
}

В этом у вас есть три анализатора в целом. Два из них объединяют два фильтра (выход первого является входом второго, поэтому порядок имеет значение). Вasticsearch вы можете указать, что поле будет анализироваться одним анализатором в течение индексного времени, а при поиске по какому-либо входу этот вход будет анализироваться другим анализатором. Таким образом, вы можете получить что-то вроде этого (отсюда https://www.elastic.co/guide/en/elasticsearch/reference/current/search-analyzer.html)

{
  "mappings": {
    "properties": {
      "text": {
        "type": "text",
        "analyzer": "autocomplete",
        "search_analyzer": "standard"
      }
    }
  }
}

Таким образом, ваши настройки / сопоставления станут такими

{
  "settings": {
    "index": {
      "number_of_shards": "128",
      "number_of_replicas": "0",
      "analysis": {
        "filter": {
          "dbl_metaphone": {
            "type": "phonetic",
            "encoder": "double_metaphone",
            "max_code_len": 5
          },
          "given_synonyms": {
            "type": "synonym",
            "synonyms_path": "analysis/given_synonyms.txt"
          },
          "surname_synonyms": {
            "type": "synonym",
            "synonyms_path": "analysis/surname_synonyms.txt"
          }
        },
        "analyzer": {
          "dbl_metaphone": {
            "tokenizer": "standard",
            "filter": "dbl_metaphone"
          },
          "dbl_metaphone_given_synonym": {
            "tokenizer": "standard",
            "filter": [
              "given_synonyms",
              "dbl_metaphone"
            ]
          },
          "dbl_metaphone_surname_synonym": {
            "tokenizer": "standard",
            "filter": [
              "surname_synonyms",
              "dbl_metaphone"
            ]
          }
        }
      }
    }
  },
  "mappings": {
    "test": {
      "_all": {
        "enabled": false
      },
      "_source": {
        "enabled": true
      },
      "properties": {
        "GivenNames": {
          "type": "keyword",
          "index_options": "freqs",
          "store": "false",
          "similarity": "boolean",
          "norms": "false",
          "fields": {
            "phonetic": {
              "type": "text",
              "analyzer": "dbl_metaphone",
              "search_analyzer": "dbl_metaphone_given_synonym"
            }
          }
        },
        "Surnames": {
          "type": "keyword",
          "index_options": "freqs",
          "store": "false",
          "similarity": "boolean",
          "norms": "false",
          "fields": {
            "phonetic": {
              "type": "text",
              "analyzer": "dbl_metaphone",
              "search_analyzer": "dbl_metaphone_surname_synonym"
            }
          }
        },
        "FatherGivenNames": {
          "type": "keyword",
          "index_options": "freqs",
          "store": "false",
          "similarity": "boolean",
          "norms": "false",
          "fields": {
            "phonetic": {
              "type": "text",
              "analyzer": "dbl_metaphone",
              "search_analyzer": "dbl_metaphone_given_synonym"
            }
          }
        },
        "FatherSurnames": {
          "type": "keyword",
          "index_options": "freqs",
          "store": "false",
          "similarity": "boolean",
          "norms": "false",
          "fields": {
            "phonetic": {
              "type": "text",
              "analyzer": "dbl_metaphone",
              "search_analyzer": "dbl_metaphone_surname_synonym"
            }
          }
        },
        "MotherGivenNames": {
          "type": "keyword",
          "index_options": "freqs",
          "store": "false",
          "similarity": "boolean",
          "norms": "false",
          "fields": {
            "phonetic": {
              "type": "text",
              "analyzer": "dbl_metaphone",
              "search_analyzer": "dbl_metaphone_given_synonym"
            }
          }
        },
        "MotherSurnames": {
          "type": "keyword",
          "index_options": "freqs",
          "store": "false",
          "similarity": "boolean",
          "norms": "false",
          "fields": {
            "phonetic": {
              "type": "text",
              "analyzer": "dbl_metaphone",
              "search_analyzer": "dbl_metaphone_given_synonym"
            }
          }
        },
        "SpouseGivenNames": {
          "type": "keyword",
          "index_options": "freqs",
          "store": "false",
          "similarity": "boolean",
          "norms": "false",
          "fields": {
            "phonetic": {
              "type": "text",
              "analyzer": "dbl_metaphone",
              "search_analyzer": "dbl_metaphone_given_synonym"
            }
          }
        },
        "SpouseSurnames": {
          "type": "keyword",
          "index_options": "freqs",
          "store": "false",
          "similarity": "boolean",
          "norms": "false",
          "fields": {
            "phonetic": {
              "type": "text",
              "analyzer": "dbl_metaphone",
              "search_analyzer": "dbl_metaphone_surname_synonym"
            }
          }
        },
        "ChildrenGivenNames": {
          "type": "keyword",
          "index_options": "freqs",
          "store": "false",
          "similarity": "boolean",
          "norms": "false",
          "fields": {
            "phonetic": {
              "type": "text",
              "analyzer": "dbl_metaphone",
              "search_analyzer": "dbl_metaphone_given_synonym"
            }
          }
        },
        "BirthYears": {
          "type": "short"
        },
        "BirthLocations": {
          "type": "integer"
        },
        "DeathYears": {
          "type": "short"
        },
        "DeathLocations": {
          "type": "integer"
        },
        "MarriageLocations": {
          "type": "integer"
        },
        "MarriageYears": {
          "type": "integer"
        },
        "ResidenceLocations": {
          "type": "integer"
        }
      }
    }
  }
}
...