2013-09-25 2 views
0

Enviroment:Lucene.Net поиск как A071, A072, A073

Lucene.Net 3,03

Visual Studio 2010


Я застрял на эту проблему в течение нескольких часов в этой точке и я не могу понять проблему.

я построить некоторый индекс с именем "Магазины", формат, как показано ниже,

A075, A073, A021 ....

каждая строка представляет идентификатор магазина, и Разделенный "" ,

я хотел бы поиск «A073», и он будет возвращать совпавшие данные, если «Магазины» включают «A073»

заранее спасибо

static RAMDirectory dir = new RAMDirectory(); 


public void BuildIndex() 
{ 

    IndexWriter iw = new IndexWriter(dir, new StandardAnalyzer(Version.LUCENE_30), true, IndexWriter.MaxFieldLength.UNLIMITED); 

    Document doc = new Document(); 
    doc.Add(new Field("PROD_ID", "", Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO)); 
    doc.Add(new Field("Stores", "", Field.Store.YES, Field.Index.ANALYZED, Field.TermVector.NO)); 

    for (int i = 1; i <= 10; i++) 
    { 
     doc.GetField("PROD_ID").SetValue(Guid.NewGuid().ToString()); 
     doc.GetField("Stores").SetValue("a075,a073,no2" + i.ToString()); 
     iw.AddDocument(doc); 
    } 

    iw.Optimize(); 
    iw.Commit(); 
    iw.Close(); 
} 

private void Search(string KeyWord) 
{ 

    IndexSearcher search = new IndexSearcher(dir, true); 

    QueryParser qp = new QueryParser(Version.LUCENE_30, "Stores", new StandardAnalyzer(Version.LUCENE_30)); 

    Query query = qp.Parse(KeyWord); 

    var hits = search.Search(query, null, search.MaxDoc).ScoreDocs; 


    foreach (var res in hits) 
    { 
     Response.Write(string.Format("PROD_ID:{0}/Stores{1}" 
            , search.Doc(res.Doc).Get("PROD_ID").ToString() 
            , search.Doc(res.Doc).Get("Stores").ToString() + "<BR>")); 
    } 
} 

ответ

0

Попробуйте использовать Lucene.Net.Search.WildcardQuery и включите подстановочные знаки. Google для поиска регулярных выражений Lucene, чтобы найти некоторый код для использования регулярных выражений в вашем запросе ... есть вкладка contrib, которая называется Contrib.Regex.RegexTermEnum.

Альтернативой было бы многозначное поле, вместо строки, разделенной запятой, вы передавали бы массив в нее. Это будет разделено и проиндексировано Lucene, и вы можете запросить его так же, как обычное поле. Кроме того, вы можете запросить его несколько раз, например. multiField: ValueA и mutliField: ValueB ...

+0

привет, Эла, я знаю, что могу использовать подстановочный знак, например, «*», но есть ли другие способы его решения. ~ спасибо – holmes2136

+0

@Holmes просмотреть последние изменения, использовать многозначное поле должен сделать это за вас – MichaC

+0

привет, Эла, вы имеете в виду использование MultifieldQueryFieldParser? но это похоже на поиск в многопользовательском поле. Не могли бы вы дать мне образец ~ thx! – holmes2136

Смежные вопросы