programing

QueryParser에 여러 필드를 통합하는 방법은 무엇입니까?

javamemo 2023. 5. 15. 20:59
반응형

QueryParser에 여러 필드를 통합하는 방법은 무엇입니까?

Dim qp1 As New QueryParser("filename", New StandardAnalyzer())
Dim qp2 As New QueryParser("filetext", New StandardAnalyzer())
.
.

루센을 사용하고 있습니다.Net' 라이브러리에 다음 질문이 있습니다.

별도로 두 개를 만드는 대신QueryParser두 개의 Hits 객체를 얻기 위해 객체와 객체를 사용하여 단일 필드를 사용하여 두 필드 모두에서 검색을 수행할 수 있습니까?QueryParser각 문서의 전체 점수를 얻을 수 있는 Hits 개체를 하나만 가질 수 있습니까?

이렇게 하는 방법은 세 가지가 있습니다.

첫 번째 방법은 수동으로 쿼리를 구성하는 것입니다. 이것은QueryParser내부적으로 하고 있습니다.이것이 가장 강력한 방법이며, 사용자 입력을 구문 분석할 필요가 없다는 것을 의미합니다. 사용자 입력의 일부 이국적인 기능에 대한 액세스를 차단하려면QueryParser:

IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);

BooleanQuery booleanQuery = new BooleanQuery();
Query query1 = new TermQuery(new Term("filename", "<text>"));
Query query2 = new TermQuery(new Term("filetext", "<text>"));
booleanQuery.add(query1, BooleanClause.Occur.SHOULD);
booleanQuery.add(query2, BooleanClause.Occur.SHOULD);
// Use BooleanClause.Occur.MUST instead of BooleanClause.Occur.SHOULD
// for AND queries
Hits hits = searcher.Search(booleanQuery);

두 번째 방법은 사용하는 것입니다.MultiFieldQueryParser이것은 다음과 같이 행동합니다.QueryParser여러 필드를 검색하는 것을 제외하고 모든 권한에 대한 액세스를 허용합니다.

IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);

Analyzer analyzer = new StandardAnalyzer();
MultiFieldQueryParser queryParser = new MultiFieldQueryParser(
                                        new string[] {"filename", "filetext"},
                                        analyzer);

Hits hits = searcher.Search(queryParser.parse("<text>"));

마지막 방법은 다음과 같은 특수 구문을 사용하는 것입니다.QueryParser 여기를 보세요.

IndexReader reader = IndexReader.Open("<lucene dir>");
Searcher searcher = new IndexSearcher(reader);    

Analyzer analyzer = new StandardAnalyzer();
QueryParser queryParser = new QueryParser("<default field>", analyzer);
// <default field> is the field that QueryParser will search if you don't 
// prefix it with a field.
string special = "filename:" + text + " OR filetext:" + text;

Hits hits = searcher.Search(queryParser.parse(special));

다른 선택사항은 파일 이름과 텍스트라는 내용을 색인화할 때 새 필드를 만드는 것입니다. 여기에 파일 이름과 파일 텍스트의 내용을 모두 넣을 수 있습니다. 그런 다음 하나의 필드만 검색하면 됩니다.

각 용어를 사용하여 쿼리 문자열을 만듭니다.

"filename:searchText OR filetext:searchText"

QueryParser의 생성자에서 초기 필드로 무엇을 전달하는지는 중요하지 않습니다.꼭 전화하세요.쿼리 문자열에서 구문 분석()하여 쿼리 개체를 다시 실행합니다.

"및" 검색을 사용하려는 경우:

"+filename:searchText +filetext:searchText"

사용할 수도 있습니다.MultiFieldQueryParser사용 가능한 모든 필드에서 검색합니다.**

Dim queryParser = New MultiFieldQueryParser(Version.LUCENE_29, 
indexReader__1.GetFieldNames(IndexReader.FieldOption.ALL).ToArray(), analyzer)

여기 완전한 예가 있습니다.

//get index directory
Dim directory As Directory = FSDirectory.Open(New DirectoryInfo(HostingEnvironment.MapPath(VirtualIndexPath)))

//get analyzer
Dim analyzer As Analyzer = New StandardAnalyzer(Version.LUCENE_29)

//get index reader and searcher
Dim indexReader__1 As IndexReader = IndexReader.Open(directory, True)
Dim indexSearch As Searcher = New IndexSearcher(indexReader__1)

//add all possible fileds in multifieldqueryparser using indexreader getFieldNames method
Dim queryParser = New MultiFieldQueryParser(Version.LUCENE_29, indexReader__1.GetFieldNames(IndexReader.FieldOption.ALL).ToArray(), analyzer)
Dim query = queryParser.Parse(Criteria)
Dim resultDocs As TopDocs = Nothing

//perform search
resultDocs = indexSearch.Search(query, indexReader__1.MaxDoc())
Dim hits = resultDocs.scoreDocs

도움이 되길 바랍니다.

각 필드에 대해 위의 쿼리 구문 분석기에서 쿼리를 만든 다음 "반드시" 발생해야 함을 나타내는 부울 쿼리에 쿼리를 추가합니다.

또는 MultiFieldQueryParser(MultiFieldQueryParser)를 확인하십시오.

언급URL : https://stackoverflow.com/questions/468405/how-to-incorporate-multiple-fields-in-queryparser

반응형