Správné nastavení elasticsearch (diakritika)

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
MirekTH
Člen | 20
+
0
-

Zdravím,

hraju si nyní s přesnější konfigurací elasticsearch. Mám problém s převáděním tvarů pomocí hunspell slovníků a vyhledávání diakritiky. Například slovo „damsky“

Pokud provedu
curl -X POST 'localhost:9200/products_v4/_analyze?analyzer=cestina' -d 'dámská'
curl -X POST 'localhost:9200/products_v4/_analyze?analyzer=cestina' -d 'dámské'

tak výstupem je vždy

{
  "tokens": [
    {
      "token": "damsky",
      "start_offset": 0,
      "end_offset": 6,
      "type": "<ALPHANUM>",
      "position": 0
    }
  ]
}

Pokud ale to stejné provedu d výrazem bez diakritiky
curl -X POST 'localhost:9200/products_v4/_analyze?analyzer=cestina' -d 'damska'

{
  "tokens": [
    {
      "token": "damska",
      "start_offset": 0,
      "end_offset": 6,
      "type": "<ALPHANUM>",
      "position": 0
    }
  ]
}

tak elastic si to nespojí a nepřevede na výraz dámský a pří vyhledávání bez diakritiky to pak nic nenajde.

Nějaký nápad jak toto upravit?

Mé nastavení analyzátoru je následující:

"analysis": {
  "analyzer": {

    "cestina": {
      "type": "custom",
      "char_filter": [
        "html_strip"
      ],
      "tokenizer": "standard",
      "filter": [
        "stopwords_CZ",
        "cs_CZ",
        "lowercase",
        "stopwords_CZ",
        "icu_folding",
        "remove_duplicities"
      ]
    }

  },
  "filter": {
    "stopwords_CZ" : {
      "type" : "stop",
      "stopwords" : [ "_czech_" ],
      "ignore_case" : true
    },
    "cs_CZ": {
      "type": "hunspell",
      "locale": "cs_CZ",
      "dedup": true,
      "recursion_level" : 0
    },
    "remove_duplicities": {
      "type": "unique",
      "only_on_same_position": false
    }
  }
}

Díky

Marek Šneberger
Člen | 130
+
0
-

Ještě Ti tam chybí filter asciifolding. Mé nastavení filtrů je lowercase, czech_stop, cs_synonyms, lemmagen_filter_cs, czech_stop, asciifolding přičemž lemmagen_filter_cs je něco jako hunspell, akorát mi to dávalo lepší výsledky.

MirekTH
Člen | 20
+
0
-

Není náhodou icu_folding takový chytřejší ASCIIfolding? Navíc mně ty vidličky vznikají asi už v cs_CZ filtru. Jinak tvé nastavení vypadá zajímavě, díky za ukázku, mám ještě následující dotazy:

  • lowercase je na prvním místě správně? Třeba hunspell mi něco občas nepřevedl pokud jsem mělo lowercase jako první. Ale lemmagen se možná chová jinak
  • jak vypadá definice filtru cs_synonyms?

Lemmagen jsem neznal a určité vyzkouším díky.

BTW. napadlo mě ještě implemetnovat při vyhledávání u každého query multi_match (cross_fields) as mít pak něco jako ["name_hu^3", "name_low"] . Mohlo by to dohleda více výsledkuů (pokud bych tam připojil i čístý text prohnaný pouze lowerem). Ale přijde mi to dost nesmyslné, zbytečně jeden text indexovat 2×. Co si o tom myslíte?

Marek Šneberger
Člen | 130
+
0
-

Abych řekl pravdu, tak nevím :/ Já to mám nastavené takhle a tak nějak mi to funguje tak jsem to neřešil. Každopádně velmi brzy to budeme řešit na více datech, tak sem pak můžu poslat konfiguraci, ke které nakonec dojdeme.

Kompletní nastavení mého indexu vypadá takhle, je to pro projektík DwarfSearch