Gdy naprawdę chcesz przeanalizować zapytanie, wystarczy wybrać poprawny analizator i format dla zapytania.
Narzędzie StandardAnalyzer nie jest dobrym wyborem podczas indeksowania czegokolwiek oprócz pełnego tekstu angielskiego, zwłaszcza w twoim przypadku! Odfiltrowuje liczby!
Najkrótszym rozwiązaniem w twoim przypadku jest stworzenie analizatora, który tokenizuje w separatorze i łączy twój obiekt w łańcuch.
Przykład:
Tworzenie Tokenizer który rozdziela w typowych separatory i analizatora, który używa go
using System.IO;
using System.Linq;
using Lucene.Net.Analysis;
namespace Project.Analysis
{
public class TermTokenizer : LetterTokenizer
{
// some static separators
private static readonly char[] NONTOKEN_CHARS = new char[] { ',', ';', ' ', '\n', '\t' };
protected override bool IsTokenChar(char c)
{
return !NONTOKEN_CHARS .Contains(c);
}
}
public class LowerCaseTermAnalyzer : Analyzer
{
public override TokenStream TokenStream(string fieldName, TextReader reader)
{
return new LowerCaseFilter(new TermTokenizer(reader));
}
}
}
użyć nowego analizatora w parsera
(Ty należy dołączyć System.Linq)
if (MetaDataID.Length > 0)
{
// the search term will look like this: "1;5;7"
string searchTerm = string.Join(";", MetaDataID);
// the query parser uses the new Analyzer
QueryParser parser = new QueryParser("MetaData",new LowerCaseTermAnalyzer());
// the parsed search term (only used internally) will look like this:
// "MetaData:1 MetaData:5 MetaData:7", which is essentially what you want to achieve
completeQuery.Add(new parser.Parse(MetaDataID), BooleanClause.Occur.MUST);
}
nie powoduje zwrotu zestawu A | B. Kiedy próbuję tego, otrzymuję wszystkie rekordy pasujące do innych klauzul MUST. To znaczy, że wygląda na to, że POWINIEN są ignorowane. – Kyle
Nie jestem pewien, czy cię rozumiem. Ale myślę, że to, czego potrzebujesz, to zagnieździć twoje BooleanQueries. –
"Musisz użyć bla ..." - ale dlaczego? –