ezfind / solr Fetch mit eztags-Filter

21.03.2013 | eZ Publish

Contents filtern nach eztags geht  normalerweise nur mit einem extended-Attribut-Filter, weil die Tags in extra DB-Tabellen abgelegt werden.solr hat damit aber keine Probleme. Ein Fetch mit Filter nac

Contents filtern nach eztags geht  normalerweise nur mit einem extended-Attribut-Filter, weil die Tags in extra DB-Tabellen abgelegt werden.solr hat damit aber keine Probleme. Ein Fetch mit Filter nach eztags sieht genauso aus wie einer nach einem beliebigen anderen Attribut:

{set $search = fetch('ezfind', 'search', hash(
                                'query',  '',
                                'query_handler', 'ezpublish',
                                'class_id', array('article','article_mainpage','image','file','flash_player','gallery'),
                                 'limit', $page_limit,
                                 'sort_by', hash('published', 'desc'),
                                  'filter', array('and', concat('path:',$node.node_id), concat('meta_main_path_string_ms:/*/',$node.node_id,'/????/'),
                                                      array( 'or',
                                                        array(concat('file/publish_date:[',$sstart,'/DAY TO ',$send,'/DAY+1DAY ]')),
                                                        array(concat('image/publish_date:[',$sstart,'/DAY TO ',$send,'/DAY+1DAY ]')),
                                                        array(concat('flash_player/publish_date:[',$sstart,'/DAY TO ',$send,'/DAY+1DAY ]')),
                                                        array(concat('gallery/publish_date:[',$sstart,'/DAY TO ',$send,'/DAY+1DAY ]')),
                                                        array(concat('article_mainpage/publish_date:[',$sstart,'/DAY TO ',$send,'/DAY+1DAY ]')),
                                                        array(concat('article/publish_date:[',$sstart,'/DAY TO ',$send,'/DAY+1DAY ]')),
                                                        ),
                                                    cond(gt($tags_query|count, 0), array( 'or',  
                                                                            concat('image/tags:(',$tags_query,')'), 
                                                                            concat('file/tags:(',$tags_query,')'),
                                                                            concat('article/tags:(',$tags_query,')'),
                                                                            concat('article_mainpage/tags:(',$tags_query,')'),
                                                                            concat('flash_player/tags:(',$tags_query,')'),
                                                                            concat('gallery/tags:(',$tags_query,')')),
                                                        ),  
                                                    ),
                                    ))
}

Etwas seltsam ist, daß man die Suche nach einem Subtree nicht in der Tiefe einschränken kann. Hier muß man Workarounds entwickeln, zB mittels Abfrage der meta_main_path_string_ms, der der $path_array-Variable entspricht. Man könnte also ein conditional einbauen, das die Tiefe des Patharrays abfragt und dann die Contents nach der Länge des Path-Strings filtert:

Hier wird das mittels concat('meta_main_path_string_ms:/*/',$node.node_id,'/????/ versucht. Es werden also nur Contents zurückgegeben, die eine Ebene unter der Node_id liegen und (genau) 4 Stellen haben. Eleganter wäre ein Fetch, der mit Regex arbeitet. Folgendes funktioniert komischerweise auf der Solr-Admin-Konsole, aber nicht mehr in einem ez-Template:

meta_main_path_string_ms:/*/<node.node_id>/(0-9)*/

Eckige Klammern gehen gar nicht (haben in solr eine andere Bedeutung (ranges). Dies hier geht auch nicht:

meta_main_path_string_ms:/*/<node.node_id>/(0-9)+/

Analyse

Entwurf

Development

Launch