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 [email protected].
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.

Reply via email to