chaining queries across multiple types

classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

chaining queries across multiple types

Rajesh Shetty
I have following application.

 Product (document of _type :  product) belongs to Category (document of _type :  category) . User (document of _type :  user)  can own these products under any categories.  1 product  can be under more than one category. couple of ways of storing the product/category in user doc

Requirement

When consumer type keywords (they could type products or categories) in an open text field, I need to find users who own these products/categories (based on the keywords typed)



Model structure

Product

{
  " _id" :  "p100",
  "_type" : "product",
   
"name" : "camera"
  "categories" :["c100","c110"]
}       

Category

{
  " _id" :  "c100",
  "_type" : "category",
   
"name" : "electronics"
}       

{
  " _id" :  "c110",  
 "_type" : "category",
   
"name" : "baby"
}       

approach 1 for user doc

Storing in denormalized form product , category name itself in the 

{
  " _id" :  "<user_id>",
   
"name" : "John Smith",
  "product_categories" :[
     {
         
"product" : "tv",
         
"category" : "electronics"
   
},
   {
         
"product" : "camera",
         
"category" : "electronics"
   
}
  ]
}

{
 " _id" :  "<user_id>",
   
"name" : "Jane Smith",
 "product_categories" :[
   {
         
"product" : "camera",
         
"category" : "baby"
   
}
 
]
}            

approach 2 for user doc

Storing in normalized form with product id  , category id . 

{
 " _id" :  "<user_id>",
   
"name" : "John Smith",
 "product_categories" :[
  {
         
"product" : "p100",
         
"category" : "c100"
   
}
  ]
}

{
" _id" :  "<user_id>",
   
"name" : "Jane Smith",
"product_categories" :[
  {
         
"product" : "p100",
         
"category" : "c110"
   
}
 
]
}            


Approach advantages and disadvantages

Approach #1

advantage
  • Possibly one query can achieve getting list of users with  search text as "camera baby"  
disadvantage
  • If ever we change product name "camera" or category name "baby" we will have a hell updating all the documents with these product and category names.

Approach #2

advantage
  • If ever we change product name "camera" or category name "baby" , we just change the name in product and category documents and all users are still related to the new names with product id and category id in the user documents
disadvantage
  • we will have to do MORE THAN 1 query to list of users with  search text as "camera baby"  

So when someone searches  
  •     "camera electronics" - john smith should show up in search result
  •     "camera baby" - jane smith should show up in search result
  •     "camera" - john smith and jane smith should show up in search result

Million $ question

Assuming I decided to go with approach #2 . How do I achieve this query in Elasticsearch ?

My approach 

  1. Fire first query against elastic search on  MULTIPLE TYPES ( product and category type index) with term "camera baby" . Which will return documents matching different types. 
  2. Group document ids based on types (application side work)
  3. Fire second query against  elastic search on a USER TYPE  index with respective ids obtained from step 2.

So the question is ....

  1. Is it even possible to fire "camera baby" query against multiple types under same index in elastic search  (remember Im doing this since when someone enters "camera baby" we don't know if each term is a product or a category ? )
  2. Is there any way to chain query in step1 and step3 without grouping ids on the application side ?
  3. Is there any better way to achieve what I'm doing ( in terms model/query/id mapping etc) above in elastic search  assuming I want to retain single place to change product /category names so that its automatically reflected to all users who own those products in specific category?

--
You received this message because you are subscribed to the Google Groups "elasticsearch" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [hidden email].
To view this discussion on the web visit https://groups.google.com/d/msgid/elasticsearch/6688550a-748c-4d7c-870e-0cf78b6ff83c%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.