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
'programing' 카테고리의 다른 글
종료 코드 1( 호출을 보려면 -v 사용), Xcode 8, Swift 3에서 링커 명령이 실패했습니다. (0) | 2023.05.15 |
---|---|
출시 후 iOS 앱에 디버거를 연결하는 방법은 무엇입니까? (0) | 2023.05.15 |
백그라운드 작업자를 사용하여 GUI를 업데이트하는 방법은 무엇입니까? (0) | 2023.05.15 |
공식 Postgre의 구성 파일을 사용자 정의하는 방법SQL Docker 이미지? (0) | 2023.05.15 |
배치 파일:하위 문자열이 (파일이 아닌) 문자열에 있는지 확인합니다. (0) | 2023.05.15 |