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