Správné nastavení elasticsearch (diakritika)
- MirekTH
- Člen | 20
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
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
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
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