며칠간의 바쁜 작업 끝에 마침내 간단한 전체 텍스트 검색을 구현했습니다.
이 기사를 검토하고 요약하겠습니다. Lucene.Net은 무엇을 할 수 있나요? 그리고 그것을하는 방법에 대한 질문은 무엇입니까? 마지막으로 전체 텍스트 검색을 구현하는 Lucene.Net의 예가 제공됩니다.
1. Lucene.Net이란 무엇입니까?
Lucene.net은 원래 오픈소스 프로젝트였다가 상용화에 돌입했다. Lucene.net 2.0도 출시됐지만 돈을 위해 D. Lucene.net의 운명은 버전 1.6 이후 출시된 2.0부터 시작된 FreeTextBox와 다소 비슷하다. 5. 상용 루트 2.0은 DLL 형태로 무료 버전을 제공하며, 소스 코드 버전은 상용 라이센스를 구매해야 합니다. 그러나 소스 코드는 버전 1.6.5로 남아 있어 내부 세부 사항은 대부분 볼 수 있습니다. , 그러나 버전 2.0에서는 Mozilla 브라우저에 대한 추가 지원이 생성된 HTML 및 JavaScript 스크립트를 통해서만 표시됩니다.
Lucene은 Java 세계에서 일반적으로 사용되는 색인 API로 제공되는 메소드를 사용하여 텍스트 자료에 대한 색인을 생성하고 검색을 제공할 수 있습니다. (참조: NLucene 및 Lucene .NET) NLucene은 최초의 .net 포트이자 .net 명명 규칙 및 클래스 라이브러리 디자인을 사용하는 .net 스타일 버전입니다. 그러나 에너지 문제로 인해 Nlucene 프로젝트의 리더는 1.2베타 버전만 출시했습니다. Lucene.NET 프로젝트가 등장한 이후에는 NLucene에 대한 새로운 계획이 없었습니다.
Lucene.NET은 원래 최신 .net Lucene 이식이라고 주장했습니다. 이름 지정 측면에서 .net의 제안만 채택했습니다. 주요 목표는 Java Lucene과 호환되는 경향이 있었습니다. 하나는 인덱스 형식을 호환되게 만드는 것이었습니다. 목적은 이름이 유사하고(대문자와 소문자 등 약간의 차이만 있음) 개발자가 Java Lucene 관련 코드 및 정보를 쉽게 사용할 수 있도록 하는 것입니다.
Lucene.NET 프로젝트가 언제 오픈 소스 계획을 포기하고 사업으로 전환했는지 모르겠습니다. 실제로 SourceForge에서 오픈 소스 파일을 삭제했습니다. 동시에 dotLucene 프로젝트가 SourceForge에 등장했습니다. Lucene.NET에 대한 항의로 dotLucene은 Lucene.NET 코드를 거의 그대로 시작점으로 두었습니다. ( https://sourceforge.net/forum/forum.php?thread_id=1153933&forum_id=408004 ).
직설적으로 말하면 Lucene.Net은 정보 검색 기능 라이브러리(라이브러리)입니다. 이를 사용하여 애플리케이션에 인덱싱 및 검색 기능을 추가할 수 있습니다.
Lucene 사용자는 전체 텍스트 검색에 대한 심층적인 지식이 필요하지 않습니다. 라이브러리 사용법만 배우면 라이브러리에 있는 함수를 호출하는 방법을 알면 애플리케이션에 대한 전체 텍스트 검색 기능을 실현할 수 있습니다.
그러나 Lucene이 Google 및 Baidu와 같은 검색 엔진이 될 것이라고 기대하지 마십시오. 인덱싱 및 검색 기능을 캡슐화한 간단하고 사용하기 쉬운 API라고 생각할 수도 있으며, 이 API를 사용하면 매우 편리하고 할 수 있습니다. 귀하의 요구를 충족시킵니다. 응용 프로그램은 간단한 전체 텍스트 검색을 수행합니다. 응용 프로그램 개발자(비전문 검색 엔진 개발자)로서 그 기능은 충분합니다.
2. Lucene.Net은 무엇을 할 수 있나요?
Lucene은 데이터 소스의 형식에 관계없이 텍스트로 변환할 수 있는 모든 데이터를 색인화하고 검색할 수 있습니다. 즉, MS Word, Html, pdf 또는 Lucene에서 분석하고 활용할 수 있습니다. 기타 Lucene에서 텍스트 내용을 추출할 수 있는 한 모든 형식의 파일을 사용할 수 있습니다. Lucene을 사용하여 해당 파일을 색인화하고 검색할 수 있습니다
.
간단히 말해서 인덱스를 생성하고 인덱스를 사용한다는 것은 검색할 데이터 소스의 정보를 핵심 정보로 저장하거나 분석하는 것이며, 검색을 위한 표시를 남기는 것은 테이블을 생성하는 것과 같습니다. Word의 내용(개인적 이해)에서 색인을 사용하는 것은 검색 시 색인 정보를 기반으로 데이터 소스를 분석하고 필요한 정보를 추출하는 것입니다.
예를 살펴보십시오:
인덱스 생성을 위한
공용 클래스 IntranetIndexer
{
/**/////인덱스 작성자
private IndexWriter Writer;
//인덱스에 쓸 파일의 루트 디렉터리입니다.
개인 문자열 docRootDirectory
//일치할 파일 형식
개인 문자열[] 패턴
/**//// <요약>
/// 인덱스 작성기를 초기화합니다. 디렉터리는 인덱스가 생성되는 디렉터리입니다. true는 인덱스 파일이 없으면 인덱스 파일이 다시 생성된다는 의미입니다. 덮어썼습니다.
/// </summary>
/// <param name="directory">인덱싱할 디렉터리가 전달됩니다. 디렉터리가 없으면 자동으로 생성됩니다.</param>
publicIntranetIndexer(문자열 디렉터리)
{
writer = new IndexWriter(디렉토리, new StandardAnalyzer(), true);
작가.SetUseCompoundFile(true);
}
public void AddDirectory(DirectoryInfo 디렉터리, 문자열 [] 패턴)
{
this.docRootDirectory = 디렉토리.FullName;
this.pattern = 패턴;
addSubDirectory(디렉토리);
}
개인 무효 addSubDirectory(DirectoryInfo 디렉토리)
{
for(int i=0;i<패턴 .길이 ;i++)
{
foreach(directory.GetFiles(pattern[i])의 FileInfo fi)
{
AddHtmlDocument(fi.FullName);
}
}
foreach(directory.GetDirectories()의 DirectoryInfo di)
{
addSubDirectory(di);
}
}
공개 무효 AddHtmlDocument(문자열 경로)
{
문자열 exname=Path.GetExtension(경로);
문서 문서 = 새 문서();
문자열 HTML;
if(exname.ToLower ()==".html" ||exname .ToLower ()==".htm"||exname .ToLower ()==".txt")
{
사용(StreamReader sr=new StreamReader (path,System .Text .Encoding .Default ))
{
html = sr.ReadToEnd();
}
}
또 다른
{
(StreamReader sr = new StreamReader(path, System.Text.Encoding.Unicode )) 사용
{
html = sr.ReadToEnd();
}
}
intrelativePathStartsAt = this.docRootDirectory.EndsWith("\") ? this.docRootDirectory.Length : this.docRootDirectory.Length + 1;
stringrelativePath = path.Substring(relativePathStartsAt);
문자열 제목=Path.GetFileName(경로);
//웹페이지인지 판단하여 태그를 제거하고, 그렇지 않으면 사용하지 않습니다.
if(exname.ToLower ()==".html" ||exname .ToLower ()==".htm")
{
doc.Add(Field.UnStored("text",parseHtml(html)));
}
또 다른
{
doc.Add(Field .UnStored("text",html));
}
doc.Add(Field.Keyword("경로", 상대 경로));
//doc.Add(Field.Text("제목", getTitle(html)));
doc.Add(필드 .Text("제목",제목));
작가.AddDocument(doc);
}
/**//// <요약>
/// 웹페이지에서 태그 제거
/// </summary>
/// <param name="html">웹페이지</param>
/// <returns>제거된 웹페이지 텍스트 반환</returns>
개인 문자열parseHtml(문자열 html)
{
string temp = Regex.Replace(html, "<[^>]*>", "");
return temp.Replace(" ", " ");
}
/**//// <요약>
/// 페이지 제목 가져오기
/// </summary>
/// <param name="html"></param>
/// <반환></반환>
개인 문자열 getTitle(문자열 html)
{
m 일치 = Regex.Match(html, "<title>(.*)</title>");
if (m.Groups.Count == 2)
m.Groups[1].값을 반환합니다.
"문서 제목을 알 수 없음"을 반환합니다.
}
/**//// <요약>
/// 인덱스 최적화 및 작성자 닫기
/// </summary>
공개 무효 닫기()
{
작가.최적화();
작가.닫기();
}
}
먼저 Document 객체를 생성한 다음 Document 객체에 Field 속성을 추가합니다. Document 객체를 나중에 정보를 얻을 수 있는 가상 파일로 생각할 수 있습니다. 그중 필드에는 네 가지 유형이 있습니다. Keywork
이 유형의 데이터는 분석되지 않지만 색인화되어 색인에 저장됩니다.
색인이 생성되지 않음
이 유형의 데이터는 분석되거나 색인화되지 않지만 색인에 저장됩니다.
저장되지 않음
UnIndexed와 정반대로 분석되고 색인이 생성되지만 저장되지는 않습니다.
텍스트
UnStored와 유사합니다. 값 유형이 문자열인 경우 저장됩니다. 값 유형이 Reader인 경우 UnStored와 마찬가지로 저장되지 않습니다.
마지막으로 각 문서가 색인에 추가됩니다.
다음은 인덱스 검색입니다
//인덱서 생성
IndexSearcher 검색자 = new IndexSearcher(indexDirectory);
//검색을 위해 인덱스의 텍스트 필드를 구문 분석합니다.
쿼리 쿼리 = QueryParser.Parse(this.Q, "text", new StandardAnalyzer());
//검색 결과를 히트 항목에 넣습니다.
조회수 조회수 = searcher.Search(query);
//검색된 총 레코드 수에 대한 통계
this.total = hit.Length();
//가장 밝은 부분
QueryHighlightExtractor 하이라이터 = new QueryHighlightExtractor(query, new StandardAnalyzer(), "<font color=red>", "</font>");
첫 번째 단계는 IndexSearcher를 사용하여 후속 검색을 위해 인덱스 파일을 여는 것이며 매개변수는 인덱스 파일의 경로입니다.
두 번째 단계는 QueryParser를 사용하여 더 읽기 쉬운 쿼리 문(예: 쿼리 단어 lucene 및 일부)을 변환하는 것입니다
.고급 방법 lucene AND.net)을 Lucene에서 내부적으로 사용하는 쿼리 개체에 추가합니다.
세 번째 단계에서는 검색을 수행하고 결과를 Hits 컬렉션에 반환합니다. 공간을 고려하여
검색 결과가 처리되어 페이지에 표시됩니다.
for (int i = startAt; i < resultsCount; i++)
{
문서 문서 = hits.Doc(i);
문자열 경로 = doc.Get("경로");
문자열 위치 =Server.MapPath("문서")+" \"+경로 ;
문자열 exname=Path.GetExtension(경로);
문자열 일반텍스트;
string str=doc.Get("제목");
if(exname==".html" || exname ==".htm" || exname ==".txt")
{
(StreamReader sr = new StreamReader(location, System.Text.Encoding.Default)) 사용
{
plainText = parsHtml(sr.ReadToEnd());
}
}
또 다른
{
(StreamReader sr = new StreamReader(location, System.Text.Encoding.Unicode )) 사용
{
plainText = sr.ReadToEnd();
}
}
//DataTable에 행 추가
DataRow 행 = this.Results.NewRow();
row["제목"] = doc.Get("제목");
string IP=Request.Url.Host;//서버 IP 가져오기
//요청.Url.포트;
행["경로"]=@" http://"+IP+"/WebUI/Search/documents/"+경로 ;
row["sample"] =highlighter.GetBestFragments(plainText, 80, 2, "");
this.Results.Rows.Add(row);
}
searcher.Close();//검색기를 닫습니다. Lucene.Net에 대한 보다 고급적이고 포괄적이며 심층적인 이해를 원하시면 웹사이트를 참조하십시오:
http: //blog.tianya.cn/blogger/view_blog.asp?BlogName=aftaft