Skip to content

Instantly share code, notes, and snippets.

@fliiiix
Created June 27, 2014 20:02
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
Save fliiiix/464bcdf712a4d589e0e3 to your computer and use it in GitHub Desktop.
querystring = "*#{q.downcase}* AND author"
respons = client.search index: 'thebookdb', body: { query:
{ query_string:
{ query: querystring, fuzziness: 2 },
}
}
@rb2k
Copy link

rb2k commented Jun 27, 2014

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

@fliiiix
Copy link
Author

fliiiix commented Jun 27, 2014

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?

@rb2k
Copy link

rb2k commented Jun 27, 2014

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

@fliiiix
Copy link
Author

fliiiix commented Jun 28, 2014

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"=>[]}}

@fliiiix
Copy link
Author

fliiiix commented Jun 28, 2014

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? 😕

@fliiiix
Copy link
Author

fliiiix commented Jun 28, 2014

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"
            }  
          }
        }
      }
    }

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment