Hi Simon,

Thank you for the source code, but it doesn't work in my case : I need
all fields from the current object, and put them in another field of
this same object.
So i get a stackoverflow on Builder.GetDocument(). This solution was
so nice to be true :)

Still searching how to do it cleanly.

On 16 oct, 22:50, Simon Laroche <[email protected]> wrote:
> Hi Mathieu,
>
> There you go,
>
> This bridge ads fields from another object into the current object. It could
> be as simple as creating a field, adding values from the object and adding
> the field to the document.
>
> Some of the names are in French but my guess is that you can understand ;)
>
>     [Indexed]
>     [ClassBridge(typeof(StatutDAjustementQualitatifClassBridge))]
>     public class StatutDAjustementQualitatif
>     {
>         ...
>     }
>
>     public class StatutDAjustementQualitatifClassBridge:IFieldBridge
>     {
>         public void Set(string name, object value, Document document,
> Field.Store store, Field.Index index, float? boost)
>         {
>             if(!(value is StatutDAjustementQualitatif))
>             {
>                 throw new ArgumentException("Value should be of type
> StatutDAjustementQualitatif for this bridge to work properly", "value");
>             }
>
>             var statutDAjustementQualitatif = (StatutDAjustementQualitatif)
> value;
>             var intervenant = statutDAjustementQualitatif.Intervenant;
>
>             Debug.Assert(intervenant != null, "Intervenant should never be
> null");
>
>             Configuration cfg =
> ActiveRecordMediator.GetSessionFactoryHolder().GetConfiguration(typeof
> (ActiveRecordBase));
>             NHibernate.Search.Impl.SearchFactoryImpl factoryImpl =
> NHibernate.Search.Impl.SearchFactoryImpl.GetSearchFactory(cfg);
>
>             DocumentBuilder builder =
> factoryImpl.GetDocumentBuilder(intervenant.GetType());
>
>             if(builder == null)
>             {
>                 throw new InvalidOperationException(
>                     string.Format("No document builder could be found for
> {0} type. Make sure the type {0} is marked with the Indexed attribute.",
>                                   intervenant.GetType()));
>             }
>
>             Document intervenantDoc = builder.GetDocument(intervenant, 0);
>
>             //Use only fields no declared in SAQ
>             foreach (Field field in intervenantDoc.Fields())
>             {
>                 if(document.GetField(field.Name()) == null)
>                 {document.Add(field);}
>             }
>         }
>     }
>
> On Fri, Oct 16, 2009 at 7:40 AM, mathieu <[email protected]> wrote:
>
> > Hi Simon,
>
> > Is it possible for you to share the code ? I tried this approach but I
> > couldn't find an easy way to get all indexed fields of my entity...
>
> > Thanks,
> > Mathieu
>
> > On Oct 16, 1:15 pm, Simon Laroche <[email protected]> wrote:
> > > Hi Mathieu,
>
> > > Then way I do this is by creating a class bridge. That way you can create
> > > and manipulate any field in the document ans you have access to your
> > object.
>
> > > Simon
>
> > > On Fri, Oct 16, 2009 at 5:34 AM, mathieu <[email protected]>
> > wrote:
>
> > > > Hello everyone,
>
> > > > How could I index "all" fields of my classes to make searching them
> > > > easier ?
> > > > For example, I have the following class :
>
> > > >    [Indexed(Index="Index")]
> > > >    public class MyEntity
> > > >    {
> > > >        [DocumentId]
> > > >        public virtual long Id { get; set; }
>
> > > >        Field(Index.Tokenized, Store = Store.Yes)]
> > > >        public virtual string Title { get; set; }
>
> > > >        [Field(Index.Tokenized, Store = Store.Yes)]
> > > >        public virtual string Description { get; set; }
> > > >    }
>
> > > > I would like to index both Title and Description in an "AllFields"
> > > > Field, so when I want to search in any fields, I just query
> > > > "AllFields:something". It's easy to do directly in Lucene.Net, but I
> > > > can't find a way to do the same in NHibernate.Search.
>
> > > > I've tried :
> > > > 1 - Putting an attribute [Field(Index.Tokenized, Store = Store.Yes,
> > > > Name="All")] on all fields that I want indexed that way, but
> > > > ScopedAnalyzer throws an exceptionon line 26 : scopedAnalyzers.Add
> > > > (scope, analyzer);
> > > > So i've added "if( !scopedAnalyzers.ContainsKey( scope ) )" just
> > > > before. But I don't like it very much...
> > > > 2 - Modifying DocumentBuilder.cs, line 392, by adding :
> > > >        propertiesMetadata.fieldBridges[i].Set(
> > > >            "AllFields",
> > > >            value,
> > > >            doc,
> > > >            propertiesMetadata.fieldStore[i],
> > > >            propertiesMetadata.fieldIndex[i],
> > > >            GetBoost(member));
> > > > But I don't like it very much neither...
>
> > > > Anyone got an idea ? I "need" this "AllFields" Field so I can search
> > > > all my index, and return "all" Documents that match my query,
> > > > regardless of their fields or type.
>
> > > > Thanks in advance,
> > > > Mathieu
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"nhusers" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/nhusers?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to