Khi bạn thực sự muốn phân tích truy vấn của mình, bạn chỉ cần chọn Trình phân tích và định dạng chính xác cho truy vấn của mình.
StandardAnalyzer không phải là lựa chọn tốt khi bạn lập chỉ mục mọi thứ trừ toàn văn tiếng Anh, đặc biệt là trong trường hợp của bạn! Nó lọc ra con số!
Giải pháp ngắn nhất trong trường hợp của bạn là tạo một trình phân tích mã thông báo tại dấu phân tách và kết hợp đối tượng của bạn thành một chuỗi.
Ví dụ:
Tạo một Tokenizer rằng chia tách tại seperators điển hình và một Analyzer sử dụng nó
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));
}
}
}
Sử dụng máy phân tích mới trong phân tích cú pháp của bạn
(Bạn cần phải bao gồm 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);
}
điều này dường như không trả lại tập hợp A | B. Khi tôi thử điều này, tôi nhận được tất cả các bản ghi khớp với mệnh đề MUST khác. Đó là để nói rằng nó xuất hiện như thể các NÊN đang bị bỏ qua. – Kyle
Không hoàn toàn chắc chắn tôi hiểu bạn. Nhưng tôi nghĩ rằng những gì bạn cần phải làm tổ BooleanQueries của bạn. –
'Bạn cần sử dụng blah ...' - nhưng tại sao? –