querystring = "*#{q.downcase}* AND author" | |
respons = client.search index: 'thebookdb', body: { query: | |
{ query_string: | |
{ query: querystring, fuzziness: 2 }, | |
} | |
} |
Was ich versuche zu bauen ist was das die Person zurück gibt von typen Author wenn man den namen so in etwa eingibt.
Wenn ich versuche diese Querys zu kombinieren komm ich auf etwas wie:
{ query:
{ query_string:
{ query: querystring, fuzziness: 2 },
constant_score: {
filter: {
exists: { type: "Author" }
}
}
}
}
Was dann Fehler gibt.
Meine daten sehen dann in etwas so aus:
{
_index: personen
_type: personen
_id: 7de51a41ef854f8ca041c3bc7710a6ef
_version: 1
_score: 1
_source: {
_rev: 1-0e3fc2091be2c729123be8fb31a05558
_id: 7de51a41ef854f8ca041c3bc7710a6ef
imagePath: /public/uploads/author/7de51a41ef854f8ca041c3bc7710a6efScreen Shot 2014-01-26 at 14.20.19.png
description: sdfsddf
lastname: dir
firstname: l33tname
type: Author
}
}
Und warum genau sind wildcard querys besser als query_string?
Ahhhh, in dem fall würd ich einfach den term filter nutzen:
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-term-filter.html
{
"query": {
"match_all": {}
},
"filter" : {
"term" : {
"type" : "Author"
}
}
}
Das gibt dir alle dokumente die den type Author haben
Hm
Es gibt zwar kein Fehler aber halt auch kein Resultat und wenn ich es richtig verstehe sind die Ergebnisse ja jetzt nicht mehr nach dem Suchbegriff geordnet.
{"took"=>2, "timed_out"=>false, "_shards"=>{"total"=>5, "successful"=>5, "failed"=>0}, "hits"=>{"total"=>0, "max_score"=>nil, "hits"=>[]}}
Ich habs mal noch etwas umgebaut aber mit mässigem Erfolg
respons = client.search index: 'thebookdb', body: {
query: {
filtered: {
query: {
query_string: {
query: querystring,
fuzziness: 2
}
},
filter: {
term: {
type: "Author"
}
}
}
}
}
Diese query gibt halt auch genau kein Resultat.
Ich habe das gefühl das der feldname thebookdb.type sein müsste aber wie mach ich so was in einem ruby hash? 😕
Ich glaube ich habs dann doch noch geschafft, nach dem ich gemerkt hab das es casesensitiv ist
equery = {
query: {
filtered: {
query: {
query_string: {
query: querystring,
fuzziness: 2
}
},
filter: {
term: {
"art" => "author"
}
}
}
}
}
was soll denn "AND author" bedeuten? das das author feld existiert?
Wenn das so ist dann würde ich zwei sachen kombinieren:
Die wildcard query: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-wildcard-query.html
Und den exist filter:
http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-exists-filter.html
Alternativ zur wildcard kannst auch die regexp query nehmen. Details hier: http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/_literal_wildcard_literal_and_literal_regexp_literal_queries.html