Luceneã®åºç€ããå°ããã€ãä»åã¯ããœãŒãã«ãã£ã¬ã³ãžããŠã¿ãããšæããŸãã
ãœãŒããè¡ãã«ã¯ãSortã¯ã©ã¹ãšSortFieldã¯ã©ã¹ã䜿çšããããããIndexSearcher#searchã¡ãœããã«å©ã蟌ã¿ãŸãã
Sort
http://lucene.apache.org/core/4_3_1/core/org/apache/lucene/search/Sort.html
SoftField
http://lucene.apache.org/core/4_3_1/core/org/apache/lucene/search/Sort.html
äœ¿ãæ¹ã¯ãå²ãšç°¡åãªããã§ããã
æºå
ã§ã¯ããã€ãéãbuild.sbtãšãœãŒã¹ã³ãŒããã
name := "lucene-sorting" version := "0.0.1-SNAPSHOT" scalaVersion := "2.10.2" organization := "littlewings" libraryDependencies ++= Seq( "org.apache.lucene" % "lucene-core" % "4.3.1", "org.apache.lucene" % "lucene-analyzers-kuromoji" % "4.3.1", "org.apache.lucene" % "lucene-queryparser" % "4.3.1" )
src/main/scala/LuceneSorting.scala
import scala.collection.JavaConverters._ import org.apache.lucene.analysis.ja.JapaneseAnalyzer import org.apache.lucene.document.{Document, Field, StringField, TextField} import org.apache.lucene.index.{DirectoryReader, IndexWriter, IndexWriterConfig} import org.apache.lucene.queryparser.classic.QueryParser import org.apache.lucene.search.{IndexSearcher, Query, Sort, SortField, TopDocs} import org.apache.lucene.store.{Directory, RAMDirectory} import org.apache.lucene.util.Version import LuceneSorting.AutoCloseableWrapper object LuceneSorting { def main(args: Array[String]): Unit = { val luceneVersion = Version.LUCENE_43 for (directory <- new RAMDirectory) { println("ããã¥ã¡ã³ã远å ") createIndex(directory, luceneVersion) println("æ€çŽ¢éå§") for (reader <- DirectoryReader.open(directory)) { val searcher = new IndexSearcher(reader) val query = createQuery("contents:ããã¥ã¡ã³ã OR contents:1 OR contents: 0", luceneVersion) println(s"Query => $query") printSearchResult(searcher, "Non Sort", searcher.search(query, null, 20)) printSearchResult(searcher, "Sort.INDEXORDER", searcher.search(query, 20, Sort.INDEXORDER)) printSearchResult(searcher, "Sort.RELEVANCE", searcher.search(query, 20, Sort.RELEVANCE)) printSearchResult(searcher, "Sort(num1 as STRING)", searcher.search(query, 20, new Sort(new SortField("num1", SortField.Type.STRING)))) printSearchResult(searcher, "Sort(num1 as INT)", searcher.search(query, 20, new Sort(new SortField("num1", SortField.Type.INT)))) try { printSearchResult(searcher, "Sort(join-nums as INT)", searcher.search(query, 20, new Sort(new SortField("join-nums", SortField.Type.INT)))) } catch { case e: NumberFormatException => println(e) } printSearchResult(searcher, "Sort(num1 as INT, num2 as INT)", searcher.search(query, 20, new Sort(new SortField("num1", SortField.Type.INT), new SortField("num2", SortField.Type.INT)))) printSearchResult(searcher, "Sort(num1 as INT, num2 as INT#reverse)", searcher.search(query, 20, new Sort(new SortField("num1", SortField.Type.INT), new SortField("num2", SortField.Type.INT, true)))) printSearchResult(searcher, "Sort(num2#reverse as INT, num1 as INT)", searcher.search(query, 20, new Sort(new SortField("num2", SortField.Type.INT, true), new SortField("num1", SortField.Type.INT)))) printSearchResult(searcher, "Sort(contents as STRING)", searcher.search(query, 20, new Sort(new SortField("contents", SortField.Type.STRING)))) } } } private def createIndex(directory: Directory, luceneVersion: Version): Unit = { val config = new IndexWriterConfig(luceneVersion, new JapaneseAnalyzer(luceneVersion)) new IndexWriter(directory, config).foreach { writer => SampleDocument.createDocs.foreach(writer.addDocument) } } private def createQuery(queryString: String, luceneVersion: Version): Query = new QueryParser(luceneVersion, "num1", new JapaneseAnalyzer(luceneVersion)) .parse(queryString) private def printSearchResult(searcher: IndexSearcher, name: String, docs: TopDocs): Unit = { println(s"$name => ãããä»¶æ°:${docs.totalHits}") val hits = docs.scoreDocs hits.take(20).foreach { h => val hitDoc = searcher.doc(h.doc) hitDoc .getFields .asScala .map(_.stringValue) .mkString(s" Score,DocNo[${h.score},${h.doc}] ", " | ", "") .foreach(print) println() } } implicit class AutoCloseableWrapper[A <: AutoCloseable](val underlying: A) extends AnyVal { def foreach(body: A => Unit): Unit = { try { body(underlying) } finally { if (underlying != null) { underlying.close() } } } } } object SampleDocument { def createDocs: List[Document] = { List( create("30", "30", "30-30", "30-30ã®ããã¥ã¡ã³ãã§ã"), create("1", "1", "1-1", "1-1ã®ããã¥ã¡ã³ãã§ã"), create("1", "90", "1-90", "1-90ã®ããã¥ã¡ã³ãã§ã"), create("2", "2", "2-2", "2-2ã®ããã¥ã¡ã³ãã§ã"), create("2", "50", "2-50", "2-50ã®ããã¥ã¡ã³ãã§ã"), create("20", "20", "20-20", "20-20ã®ããã¥ã¡ã³ãã§ã"), create("10", "10", "10-10", "10-10ã®ããã¥ã¡ã³ãã§ã") ) } private def create(tokens: String*): Document = { val doc = new Document doc.add(stringField("num1", tokens(0))) doc.add(stringField("num2", tokens(1))) doc.add(stringField("join-nums", tokens(2))) doc.add(textField("contents", tokens(3))) doc } private def stringField(name: String, value: String): Field = new StringField(name, value, Field.Store.YES) private def textField(name: String, value: String): Field = new TextField(name, value, Field.Store.YES) }
ã¯ãšãªãããã¥ã¡ã³ããè¶ é©åœã§ãã
ããã¥ã¡ã³ãã¯ã
List( create("30", "30", "30-30", "30-30ã®ããã¥ã¡ã³ãã§ã"), create("1", "1", "1-1", "1-1ã®ããã¥ã¡ã³ãã§ã"), create("1", "90", "1-90", "1-90ã®ããã¥ã¡ã³ãã§ã"), create("2", "2", "2-2", "2-2ã®ããã¥ã¡ã³ãã§ã"), create("2", "50", "2-50", "2-50ã®ããã¥ã¡ã³ãã§ã"), create("20", "20", "20-20", "20-20ã®ããã¥ã¡ã³ãã§ã"), create("10", "10", "10-10", "10-10ã®ããã¥ã¡ã³ãã§ã") )
ãšããããã«ãã¡ãã£ãšãããšãããæããã¯ãšãªã¯
val query = createQuery("contents:ããã¥ã¡ã³ã OR contents:1 OR contents: 0", luceneVersion)
ãšããããã«ãcontentsãã£ãŒã«ãå ã®ãããã¥ã¡ã³ããã1ãã0ããããã°ãã¹ã³ã¢ãšããŠäžäœã«ãªãããã«ããŠããŸãã
ããã«å¯ŸããŠãSortãæå®ãããããªãã ã£ãããSortã®æ¡ä»¶ãå€ããŠåããèŠãŠãããŸãã
ãªããä»åã¯IndexSearcherã®searchã¡ãœããã®ãã¡ã
public TopFieldDocs search(Query query, int n, Sort sort) throws IOException
ã䜿çšããŠããŸããFilterã䜿ã£ãŠãªããâŠã
IndexSearcher#search(Query, int, Sort)
http://lucene.apache.org/core/4_3_1/core/org/apache/lucene/search/IndexSearcher.html#search%28org.apache.lucene.search.Query,%20int,%20org.apache.lucene.search.Sort%29
çµæåºåã¯ããããªã¡ãœãããçšæããŠãããŸããŠ
private def printSearchResult(searcher: IndexSearcher, name: String, docs: TopDocs): Unit = { println(s"$name => ãããä»¶æ°:${docs.totalHits}") val hits = docs.scoreDocs hits.take(20).foreach { h => val hitDoc = searcher.doc(h.doc) hitDoc .getFields .asScala .map(_.stringValue) .mkString(s" Score,DocNo[${h.score},${h.doc}] ", " | ", "") .foreach(print) println() } }
åŒã³åºãå ã§ããããªæãã§åŒã³åºããŸãã
printSearchResult(searcher, "Sort.INDEXORDER", searcher.search(query, 20, Sort.INDEXORDER))
ã¯ãã
åäœç¢ºèª
ã§ã¯ããŸãã¯ãœãŒããããªãå Žåã
printSearchResult(searcher, "Non Sort", searcher.search(query, null, 20))
çµæã
Non Sort => ãããä»¶æ°:7 Score,DocNo[0.5187427,1] 1 | 1 | 1-1 | 1-1ã®ããã¥ã¡ã³ãã§ã Score,DocNo[0.38726074,2] 1 | 90 | 1-90 | 1-90ã®ããã¥ã¡ã³ãã§ã Score,DocNo[0.034917552,0] 30 | 30 | 30-30 | 30-30ã®ããã¥ã¡ã³ãã§ã Score,DocNo[0.034917552,3] 2 | 2 | 2-2 | 2-2ã®ããã¥ã¡ã³ãã§ã Score,DocNo[0.034917552,4] 2 | 50 | 2-50 | 2-50ã®ããã¥ã¡ã³ãã§ã Score,DocNo[0.034917552,5] 20 | 20 | 20-20 | 20-20ã®ããã¥ã¡ã³ãã§ã Score,DocNo[0.034917552,6] 10 | 10 | 10-10 | 10-10ã®ããã¥ã¡ã³ãã§ã
ã¹ã³ã¢ãšããã¥ã¡ã³ãã®NoãåºåãããŠããŸãã䞊ã³é ã¯ãã¹ã³ã¢é ã§ããã
ããã§ã¯ãããããSortã¯ã©ã¹ã䜿çšããŸãã
ãŸãã¯ãã€ã³ããã¯ã¹Noã®é ã«ãœãŒããpublic static finalãªãã£ãŒã«ããSort.INDEXORDERãsearchã¡ãœããã«æå®ããŸãã
printSearchResult(searcher, "Sort.INDEXORDER", searcher.search(query, 20, Sort.INDEXORDER))
çµæã
Sort.INDEXORDER => ãããä»¶æ°:7 Score,DocNo[NaN,0] 30 | 30 | 30-30 | 30-30ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,1] 1 | 1 | 1-1 | 1-1ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,2] 1 | 90 | 1-90 | 1-90ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,3] 2 | 2 | 2-2 | 2-2ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,4] 2 | 50 | 2-50 | 2-50ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,5] 20 | 20 | 20-20 | 20-20ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,6] 10 | 10 | 10-10 | 10-10ã®ããã¥ã¡ã³ãã§ã
ã¹ã³ã¢ã®æ¬ããNaNãã«ãªããã¹ã³ã¢èšç®ãè¡ãããªããªãã¿ããã§ããé çªã¯ãããã¥ã¡ã³ãã®çªå·é ã«ãªã£ãŠããŸããã
ç¶ããŠãã¹ã³ã¢èšç®é ïŒSort.RELEVANCEãsearchã¡ãœããã«æå®ããŸãã
printSearchResult(searcher, "Sort.RELEVANCE", searcher.search(query, 20, Sort.RELEVANCE))
çµæã
Sort.RELEVANCE => ãããä»¶æ°:7 Score,DocNo[NaN,1] 1 | 1 | 1-1 | 1-1ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,2] 1 | 90 | 1-90 | 1-90ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,0] 30 | 30 | 30-30 | 30-30ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,3] 2 | 2 | 2-2 | 2-2ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,4] 2 | 50 | 2-50 | 2-50ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,5] 20 | 20 | 20-20 | 20-20ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,6] 10 | 10 | 10-10 | 10-10ã®ããã¥ã¡ã³ãã§ã
ã¹ã³ã¢ãããNaNãã§ããã䞊ã³é ã¯ãœãŒãããªãå Žåãšåãã¿ããã§ããã
ã§ã¯ãããããå ·äœçã«ãœãŒããããã£ãŒã«ããšãœãŒãæ¹æ³ãæå®ããŠãããŸãããã
Sortãå ·äœçã«æç€ºããå Žåã¯ãSortã¯ã©ã¹ã®ã€ã³ã¿ã³ã¹äœææã«ãã©ã®ãã£ãŒã«ãã§ãœãŒãããããSortFieldã®ã€ã³ã¹ã¿ã³ã¹ãäœæããŠæç€ºããŸãã
ãŸãããœãŒã察象ã®ãã£ãŒã«ãã¯ã
- ã€ã³ããã¯ã¹åã®å¯Ÿç§°ãšããå¿ èŠããã
- ããŒã¯ã³åããã¹ãã§ã¯ãªã
- æ€çŽ¢çµæãšããŠããŒã¿ãäžèŠã§ããã°ãStoreããå¿ èŠã¯ãªã
ã€ãŸããããããããšã ãããªã
document.add (new Field ("byNumber", Integer.toString(x), Field.Store.NO, Field.Index.NOT_ANALYZED));
åèïŒ
http://lucene.apache.org/core/4_3_1/core/org/apache/lucene/search/Sort.html
ãŸããããŒã¿ãã©ã®ããã«æ±ã£ãŠãœãŒããããããSort.Typeåæåã§æå®ããŸããSort.Typeã«ã¯
- BYTE
- BYTES
- CUSTOM
- DOC
- DOUBLE
- FLOAT
- INT
- LONG
- REWRITEABLE
- SCORE
- SHORT
- STRING
- STRING_VAL
ãšãããœãŒãæ¹æ³ããããŸããå ã®äŸã§äœ¿çšããã®ã¯ãDOCãšSCOREã§ããã
ããã§ã¯ãé æ¬¡äœ¿ã£ãŠãããŸãããã
num1ãã£ãŒã«ããããSTRINGããšããŠãœãŒãããŸãã
printSearchResult(searcher, "Sort(num1 as STRING)", searcher.search(query, 20, new Sort(new SortField("num1", SortField.Type.STRING))))
çµæã
Sort(num1 as STRING) => ãããä»¶æ°:7 Score,DocNo[NaN,1] 1 | 1 | 1-1 | 1-1ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,2] 1 | 90 | 1-90 | 1-90ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,6] 10 | 10 | 10-10 | 10-10ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,3] 2 | 2 | 2-2 | 2-2ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,4] 2 | 50 | 2-50 | 2-50ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,5] 20 | 20 | 20-20 | 20-20ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,0] 30 | 30 | 30-30 | 30-30ã®ããã¥ã¡ã³ãã§ã
ç¶ããŠãnum1ãã£ãŒã«ãããINTããšããŠãœãŒãããŸãã
printSearchResult(searcher, "Sort(num1 as INT)", searcher.search(query, 20, new Sort(new SortField("num1", SortField.Type.INT))))
çµæã
Sort(num1 as INT) => ãããä»¶æ°:7 Score,DocNo[NaN,1] 1 | 1 | 1-1 | 1-1ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,2] 1 | 90 | 1-90 | 1-90ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,3] 2 | 2 | 2-2 | 2-2ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,4] 2 | 50 | 2-50 | 2-50ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,6] 10 | 10 | 10-10 | 10-10ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,5] 20 | 20 | 20-20 | 20-20ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,0] 30 | 30 | 30-30 | 30-30ã®ããã¥ã¡ã³ãã§ã
Sort.Typeã®æå®ã§ããœãŒãçµæãå€ãã£ãããšãããããŸãã
ãŸãããINTãããFLOATããªã©ã®åãæå®ããå Žåã«ãå®éã«ãã®åœ¢ã«å€æã§ããªããããªããŒã¿ãæž¡ããšãäŸå€ãã¹ããŒãããŸãã
try { printSearchResult(searcher, "Sort(join-nums as INT)", searcher.search(query, 20, new Sort(new SortField("join-nums", SortField.Type.INT)))) } catch { case e: NumberFormatException => println(e) }
çµæã
java.lang.NumberFormatException: Invalid shift value in prefixCoded bytes (is encoded value really an INT?)
èŠäºã«ãã³ã±ãŸãã
è€æ°ãã£ãŒã«ãã§ãœãŒãããå Žåã¯ãSortã¯ã©ã¹ã®ã³ã³ã¹ãã©ã¯ã¿ã«SortFieldãè€æ°æå®ããŸãã
printSearchResult(searcher, "Sort(num1 as INT, num2 as INT)", searcher.search(query, 20, new Sort(new SortField("num1", SortField.Type.INT), new SortField("num2", SortField.Type.INT))))
çµæã
Sort(num1 as INT, num2 as INT) => ãããä»¶æ°:7 Score,DocNo[NaN,1] 1 | 1 | 1-1 | 1-1ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,2] 1 | 90 | 1-90 | 1-90ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,3] 2 | 2 | 2-2 | 2-2ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,4] 2 | 50 | 2-50 | 2-50ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,6] 10 | 10 | 10-10 | 10-10ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,5] 20 | 20 | 20-20 | 20-20ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,0] 30 | 30 | 30-30 | 30-30ã®ããã¥ã¡ã³ãã§ã
éé ã§ãœãŒãããã«ã¯ãSortFieldã®ã³ã³ã¹ãã©ã¯ã¿ã®ç¬¬3åŒæ°ãtrueã«ããŸãããã
printSearchResult(searcher, "Sort(num1 as INT, num2 as INT#reverse)", searcher.search(query, 20, new Sort(new SortField("num1", SortField.Type.INT), new SortField("num2", SortField.Type.INT, true))))
çµæã
Sort(num1 as INT, num2 as INT#reverse) => ãããä»¶æ°:7 Score,DocNo[NaN,2] 1 | 90 | 1-90 | 1-90ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,1] 1 | 1 | 1-1 | 1-1ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,4] 2 | 50 | 2-50 | 2-50ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,3] 2 | 2 | 2-2 | 2-2ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,6] 10 | 10 | 10-10 | 10-10ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,5] 20 | 20 | 20-20 | 20-20ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,0] 30 | 30 | 30-30 | 30-30ã®ããã¥ã¡ã³ãã§ã
å¥ã«ããã£ãŒã«ãã®å®çŸ©é ã«äžŠãã§ããå¿ èŠããªãã¿ããã§ãã
printSearchResult(searcher, "Sort(num2#reverse as INT, num1 as INT)", searcher.search(query, 20, new Sort(new SortField("num2", SortField.Type.INT, true), new SortField("num1", SortField.Type.INT))))
çµæã
Sort(num2#reverse as INT, num1 as INT) => ãããä»¶æ°:7 Score,DocNo[NaN,2] 1 | 90 | 1-90 | 1-90ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,4] 2 | 50 | 2-50 | 2-50ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,0] 30 | 30 | 30-30 | 30-30ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,5] 20 | 20 | 20-20 | 20-20ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,6] 10 | 10 | 10-10 | 10-10ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,3] 2 | 2 | 2-2 | 2-2ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,1] 1 | 1 | 1-1 | 1-1ã®ããã¥ã¡ã³ãã§ã
ã¡ãªã¿ã«ãããŒã¯ã³åãããŠãããã£ãŒã«ãããã ãªã«ãœãŒãããããšããŠã¿ãŸããã
printSearchResult(searcher, "Sort(contents as STRING)", searcher.search(query, 20, new Sort(new SortField("contents", SortField.Type.STRING))))
å€åãæããããªããšããããã€ã³ããã¯ã¹ã®Noé ã«äžŠãã§ããæ°ãããŸãã
Sort(contents as STRING) => ãããä»¶æ°:7 Score,DocNo[NaN,0] 30 | 30 | 30-30 | 30-30ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,1] 1 | 1 | 1-1 | 1-1ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,2] 1 | 90 | 1-90 | 1-90ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,3] 2 | 2 | 2-2 | 2-2ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,4] 2 | 50 | 2-50 | 2-50ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,5] 20 | 20 | 20-20 | 20-20ã®ããã¥ã¡ã³ãã§ã Score,DocNo[NaN,6] 10 | 10 | 10-10 | 10-10ã®ããã¥ã¡ã³ãã§ã
ã¡ãªã¿ã«ãSortã¯ã©ã¹ã®ã€ã³ã¹ã¿ã³ã¹ã¯ãœãŒãé ãå€ãããªããã°ãåå©çšå¯ãã¹ã¬ããã»ãŒãã ããã§ã
Object Reuse
One of these objects can be used multiple times and the sort order changed between usages.
This class is thread safe.
ãŸãããœãŒãã¯åèªãå éšçã«ãã£ãã·ã¥ããããã§ãããã£ãã·ã¥ã®å€§ããã¯ãIndexReader.maxDoc()ã§è¿ãããé·ãã«äŸåãããIntegerãŸãã¯Floatã®é åãäœæããããã§ããâŠãBYTESæå®ã®å Žåã¯ãäžèšã®èšç®åŒã«ãªãã¿ããã§ãã
4 * IndexReader.maxDoc() * (# of different fields actually used to sort)
4ã¯ããã£ãŒã«ãã®ååâŠïŒ
Stringã䜿çšããå Žåã¯ãäžèšã«å ããŠãã£ãŒã«ãäžã®åTermã®å€ãã¡ã¢ãªã«æã¡ç¶ããããã§ãããŠããŒã¯ãªåèªã倧éã«ç»å Žããããã ãšããã£ãã·ã¥ããšãŠã倧ãããªãããâŠãšã
ãã£ãã·ã¥ã®ãµã€ãºã¯ãã©ã®ãããå€ãã®ãã£ãŒã«ããå®çŸ©ããããã«ã¯äŸåããŸãããå®éã«ãœãŒãã«äœ¿çšããããã£ãŒã«ãã«å¯ŸããŠã®ã¿å©çšãããããšããã¿ããã§ããã