[ElasticSearch] zoeken op min. een waarde die NIET voldoet

Pagina: 1
Acties:

Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
Ik ben met ElasticSearch bezig. Nog niet zo ervaren, maar begin het te leren :)
Stuit nu op een probleem waar ik nog geen oplossing voor gevonden heb. De zoekwoorden zijn ook wat lastig in deze, omdat woorden als NOT e.d. nogal veel gebruikt worden in functies van ElasticSearch die ik niet nodig denk te hebben. Verder bevat de ElasticSearch site vooral veel syntax pagina's maar geen echt goede examples.

Ter illustratie heb ik een database met huisjes. Deze huisjes hebben 1 of meerdere kenmerken die in een array zijn ingelezen in ElasticSearch:
mogelijke kenmerken zijn:
rood, 6-persoons, garage, openhaard, oprijlaan, groentetuin, geel, koop, huur

Nu heb je bijv. de volgende drie huisjes:
huis 1 - rood, oprijlaan
huis 2 - rood
huis 3 - groentetuin, garage, huur

Nu wil ik alle huisjes die minimaal 1 kenmerk hebben die niet gelijk is aan "rood"... in dit geval dus huis 1 en huis 3.... maar ik krijg het met elastic search niet voor elkaar.

Het lijkt een eenvoudige zin hierboven, die je zo in een SQL query om kunt zetten (uiteraard op meerdere manieren mogelijk):
code:
1
SELECT * FROM huisjes LEFT JOIN kenmerken ON kenmerken.kenmerk != 'rood' and huisjes.id = kenmerken.huisjeid WHERE kenmerken.id IS NOT NULL


Heb het bij ElasticSearch geprobeerd met de must, must_not, should en diverse andere variaties.

Heb ook gedacht: Geef me alle huisjes waar rood niet voorkomt (must_not) (huisje 3) + alle huisjes met minimaal 2 kenmerken (huisje 1 en 3).... dan krijg ik het gewenste resultaat.... maar ook geen idee hoe ik daar ga komen :)

iemand enig idee of schop in de goede richting voor mij?

Acties:
  • 0 Henk 'm!

  • curvemod
  • Registratie: Maart 2009
  • Laatst online: 06:12
Wat heb je precies geprobeerd met die must_not? Volgens mij kan je die icm een terms filter gebruiken om te filteren wat je hierboven beschrijft?

Acties:
  • 0 Henk 'm!

  • P.O. Box
  • Registratie: Augustus 2005
  • Niet online
ik heb uiteindelijk inderdaad een filter gebruikt... maar heb ook de ElasticSearch database opnieuw moeten vullen. Heb een tag "kenmerk_count" toegevoegd aan ieder huisje (huisjes zijn overigens een fictief voorbeeld) waarin staat hoeveel kenmerken er zijn, en heb aan de search query een filter toegevoegd:

JSON:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
"or": [
{
    "term": {
           "kenmerk": "rood"
     }
},
{
     "range" {
           "kenmerk_count": {
                     "gte": 2
           } 
     }
}
]