2013-03-18 1 views
0

Я использую PerFieldAnalyzer установить ExactTitle использовать новый LowercaseKeywordAnalyzer:Создано LowercaseKeywordAnalyzer в сочетании с TermQuery не возвращаются результаты

private Analyzer GetDefaultAnalyzer() 
    { 
     var perFieldAnalyzer = new PerFieldAnalyzerWrapper(new StandardAnalyzer(Version.LUCENE_30)); 
     perFieldAnalyzer.AddAnalyzer(ReportFields.ExactTitle, new LowercaseKeywordAnalyzer()); 
... 

Я строю индекс, добавляя в поле:

var exactTitleField = new Field(ReportFields.ExactTitle, report.PortalReportTitle, Field.Store.NO, 
              Field.Index.NOT_ANALYZED); 
      exactTitleField.Boost = 10.0f; 
      reportDoc.Add(exactTitleField); 

Когда я просматриваю его, используя пример из 2 слов «test abc», он не находит его, когда я выполняю поиск по нему TermQuery:

var term = new Term(exactField, "test abc"); 
var exactQuery = new TermQuery(term); 
query.Add(exactQuery,Occur.SHOULD); 
var hits = searcher.Search(query, null, HitsLimit, Sort.RELEVANCE); 

Если я выполняю поиск «Test Abc», он работает. Что я могу сделать, чтобы сделать этот регистр нечувствительным к ключевым словам/поисковым работам?

Вот анализатор:

public class LowercaseKeywordAnalyzer : Analyzer 
{ 

    public override TokenStream TokenStream(string fieldName, System.IO.TextReader reader) 
    { 
     TokenStream tokenStream = new KeywordTokenizer(reader); 
     tokenStream = new LowerCaseFilter(tokenStream); 
     return tokenStream; 
    } 
} 

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

ответ

2

При указании Field.Index.NOT_ANALYZED при создании поля, анализатор не будет работать, и текст не будет преобразован в нижний регистр

переключатель это для Field.Index.ANALYZED

EDIT

Возможно есть проблема с вашим кодом индексирования, а также не забывайте, что если вы укажете более низкий регистр при индексировании, вы также можете ввести регистр ввода во время поиска, чтобы получить соответствие.

Поскольку вы создаете запрос вручную, вам нужно будет обработать его самостоятельно. В идеале вы хотите запустить тот же самый Analyzer на строке, прежде чем строить свой Term во время поиска.

Я поставил небольшой образец, который делает то, что вы пытаетесь сделать, может быть, это поможет вам понять, что не так.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Lucene.Net.Analysis; 
using Lucene.Net.Analysis.Standard; 
using Lucene.Net.Documents; 
using Lucene.Net.Index; 
using Lucene.Net.Search; 
using Lucene.Net.Store; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      RAMDirectory dir = new RAMDirectory(); 
      var perFieldAnalyzer = new PerFieldAnalyzerWrapper(new StandardAnalyzer(Lucene.Net.Util.Version.LUCENE_30)); 
      perFieldAnalyzer.AddAnalyzer("ExactTitle", new LowercaseKeywordAnalyzer()); 

      IndexWriter indexWriter = new IndexWriter(dir, perFieldAnalyzer, IndexWriter.MaxFieldLength.UNLIMITED); 

      Document reportDoc = new Document(); 
      Field exactTitleField = new Field("ExactTitle", 
               "Test Abc", 
               Field.Store.NO, 
               Field.Index.ANALYZED); 

      reportDoc.Add(exactTitleField); 
      indexWriter.AddDocument(reportDoc); 
      indexWriter.Commit(); 

      IndexSearcher searcher = new IndexSearcher(indexWriter.GetReader()); 

      var term = new Term("ExactTitle", "test abc"); //note: for this to work this way you need to always lower case the search too 
      var exactQuery = new TermQuery(term); 

      var hits = searcher.Search(exactQuery, null, 25, Sort.RELEVANCE); 
      Console.WriteLine(hits.TotalHits); // prints "1" 
      Console.ReadLine(); 

      indexWriter.Close(); 

     } 

     public class LowercaseKeywordAnalyzer : Analyzer 
     { 

      public override TokenStream TokenStream(string fieldName, System.IO.TextReader reader) 
      { 
       TokenStream tokenStream = new KeywordTokenizer(reader); 
       tokenStream = new LowerCaseFilter(tokenStream); 
       return tokenStream; 
      } 
     } 
    } 
} 
+0

Это имеет смысл. Если я переключу его на ANALYZED, то не будет найдено «test abc» или «Test Abc». Вы видите что-то еще, что я пропустил? – DougJones

+0

Большое спасибо за размещение кода. Оказалось, что я не устанавливал анализатор правильно при индексировании (несколько методов, изменение 1 и попадание в другое). Сказав это, вы помогли мне преодолеть следующую проблему, отметив, что мне нужно ввести строчный запрос. Еще раз спасибо! – DougJones

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