Cuando realmente quiere analizar su consulta, solo tiene que elegir el analizador y el formato correctos para su consulta.
El StandardAnalyzer no es una buena opción cuando indexa cualquier cosa excepto el texto completo en inglés, ¡especialmente no en su caso! ¡Filtra los números!
La solución más corta en su caso es crear un analizador que se una en un separador y combine su objeto en una cadena.
Ejemplo:
Crear un Tokenizer que se divide en separadores típicos y un analizador que utiliza
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));
}
}
}
uso del nuevo analizador en su analizador
(Usted necesita incluir 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);
}
esto no parece devolver el conjunto A | B. Cuando intento esto obtengo todos los registros que coinciden con la otra cláusula DEBE. Es decir, parece que los DEBERES están siendo ignorados. – Kyle
No estoy muy seguro de que te entendamos. Pero creo que lo que debes hacer es anidar tus BooleanQueries. –
'Necesita usar bla ...', pero ¿por qué? –